SAFE and dilution math
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Use this when the user wants a cap table calculator or startup dilution calculator: a pro-forma cap table before and after post-money or pre-money SAFEs, convertible notes (principal plus simple interest, cap, discount) and/or a priced round (pre-money valuation, new money, target option pool topped up in the pre-money). Returns price per share, each instrument's cap price, discount price and conversion price (the lower), shares issued, each holder's fully diluted % before and after, an Excel cap table and a PDF summary. Solves the circular pool and conversion math with fractions, then rounds to whole shares. Illustrative only; does not model liquidation preferences, vesting, anti-dilution or more than one priced round, and is not legal or tax advice.
Current holders with shares, fully diluted, including granted options and the unallocated pool. Array, e.g. [{"name":"Alice","shares":4500000},{"name":"Bob","shares":4500000},{"name":"Option pool","shares":1000000,"kind":"pool"}], or text "Alice 4.5M; Bob 4.5M; Option pool 1M".
Convertible notes, e.g. [{"principal":250000,"interest_rate":6,"issue_date":"2025-03-01","valuation_cap":6000000,"discount":20}].
The priced round. Leave out to see ownership with SAFEs converted at their caps only.
SAFEs to convert, e.g. [{"name":"Angels","amount":500000,"valuation_cap":8000000,"discount":20}] or text "$500k at $8M post cap 20% discount; $250k MFN".
ISO currency code for labels, default USD, e.g. EUR.
Shortcut for round.new_money, e.g. 5000000.
Company name for the files, e.g. "Acme Robotics".
Shortcut for round.pre_money_valuation, e.g. "$20M".
Shortcut for round.target_pool_percent, e.g. 10.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http cap-table https://cap-table.zovo.one/mcp
Use this when the user wants a cap table calculator or startup dilution calculator: a pro-forma cap table before and after post-money or pre-money SAFEs, convertible notes (principal plus simple interest, cap, discount) and/or a priced round (pre-money valuation, new money, target option pool topped up in the pre-money). Returns price per share, each instrument's cap price, discount price and conversion price (the lower), shares issued, each holder's fully diluted % before and after, an Excel cap table and a PDF summary. Solves the circular pool and conversion math with fractions, then rounds to whole shares. Illustrative only; does not model liquidation preferences, vesting, anti-dilution or more than one priced round, and is not legal or tax advice.
| Argument | Type | Description |
|---|---|---|
| notes | any | Convertible notes, e.g. [{"principal":250000,"interest_rate":6,"issue_date":"2025-03-01","valuation_cap":6000000,"discount":20}]. |
| round | any | The priced round. Leave out to see ownership with SAFEs converted at their caps only. |
| safes | any | SAFEs to convert, e.g. [{"name":"Angels","amount":500000,"valuation_cap":8000000,"discount":20}] or text "$500k at $8M post cap 20% discount; $250k MFN". |
| holders* | any | Current holders with shares, fully diluted, including granted options and the unallocated pool. Array, e.g. [{"name":"Alice","shares":4500000},{"name":"Bob","shares":4500000},{"name":"Option pool","shares":1000000,"kind":"pool"}], or text "Alice 4.5M; Bob 4.5M; Option pool 1M". |
| currency | any | ISO currency code for labels, default USD, e.g. EUR. |
| new_money | number | string | null | Shortcut for round.new_money, e.g. 5000000. |
| company_name | any | Company name for the files, e.g. "Acme Robotics". |
| pre_money_valuation | number | string | null | Shortcut for round.pre_money_valuation, e.g. "$20M". |
| target_pool_percent | number | string | null | Shortcut for round.target_pool_percent, e.g. 10. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"holders"
],
"properties": {
"notes": {
"anyOf": [
{
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
],
"description": "Note label, e.g. \"Bridge note\"."
},
"discount": {
"type": [
"number",
"string",
"null"
],
"description": "Discount in percent, e.g. 20."
},
"principal": {
"type": [
"number",
"string",
"null"
],
"description": "Principal, e.g. 250000 or \"$250k\"."
},
"issue_date": {
"anyOf": [
{
"type": "string",
"maxLength": 30
},
{
"type": "null"
}
],
"description": "Date the note was issued, e.g. 2025-03-01. Interest accrues from here to conversion_date (actual days / 365)."
},
"interest_rate": {
"type": [
"number",
"string",
"null"
],
"description": "Simple annual interest in percent, e.g. 6 for 6%."
},
"valuation_cap": {
"type": [
"number",
"string",
"null"
],
"description": "Valuation cap, e.g. 6000000. Cap price = cap / fully diluted shares before the round (excluding converting securities and the new pool)."
},
"conversion_date": {
"anyOf": [
{
"type": "string",
"maxLength": 30
},
{
"type": "null"
}
],
"description": "Conversion date, e.g. 2026-06-30. Default: the round date, else today (America/New_York)."
}
},
"additionalProperties": {}
}
},
{
"type": "string"
}
]
},
{
"type": "null"
}
],
"description": "Convertible notes, e.g. [{\"principal\":250000,\"interest_rate\":6,\"issue_date\":\"2025-03-01\",\"valuation_cap\":6000000,\"discount\":20}]."
},
"round": {
"anyOf": [
{
"type": "object",
"properties": {
"date": {
"anyOf": [
{
"type": "string",
"maxLength": 30
},
{
"type": "null"
}
],
"description": "Closing date, used as the note conversion date, e.g. 2026-06-30."
},
"name": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
],
"description": "Round name, e.g. \"Series A\" (default \"Priced round\")."
},
"investors": {
"anyOf": [
{
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
],
"description": "New investor name, e.g. \"Lead VC\"."
},
"amount": {
"type": [
"number",
"string",
"null"
],
"description": "Amount invested in the round, e.g. 3000000."
}
},
"additionalProperties": {}
}
},
{
"type": "string"
}
]
},
{
"type": "null"
}
],
"description": "Optional split of new money by investor, e.g. [{\"name\":\"Lead\",\"amount\":4000000},{\"name\":\"Angels\",\"amount\":1000000}]."
},
"new_money": {
"type": [
"number",
"string",
"null"
],
"description": "New cash invested in the round, e.g. 5000000 or \"$5M\". Not counting SAFEs or notes converting."
},
"pre_money_valuation": {
"type": [
"number",
"string",
"null"
],
"description": "Pre-money valuation of the priced round, e.g. 20000000 or \"$20M\". Includes the pool top-up and the conversions (standard term sheet convention)."
},
"target_pool_percent": {
"type": [
"number",
"string",
"null"
],
"description": "Unallocated option pool target after the round, in percent of post-money fully diluted shares, e.g. 10. The top-up is in the pre-money (the pool shuffle)."
},
"post_money_valuation": {
"type": [
"number",
"string",
"null"
],
"description": "Instead of pre_money_valuation: post-money valuation, e.g. 25000000 (pre = post - new money)."
}
},
"additionalProperties": {}
},
{
"type": "null"
}
],
"description": "The priced round. Leave out to see ownership with SAFEs converted at their caps only."
},
"safes": {
"anyOf": [
{
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"properties": {
"mfn": {
"type": [
"boolean",
"string",
"null"
],
"description": "true for an MFN SAFE: it takes the lowest cap and highest discount of SAFEs listed after it."
},
"name": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
],
"description": "Investor or SAFE label, e.g. \"Angel SAFE\"."
},
"type": {
"anyOf": [
{
"type": "string",
"maxLength": 20
},
{
"type": "null"
}
],
"description": "post (YC post-money SAFE, default) or pre (pre-money SAFE)."
},
"amount": {
"type": [
"number",
"string",
"null"
],
"description": "Investment (purchase amount), e.g. 500000 or \"$500k\"."
},
"discount": {
"type": [
"number",
"string",
"null"
],
"description": "Discount in percent, e.g. 20 for 20% (a YC \"discount rate\" of 80% is read as a 20% discount)."
},
"valuation_cap": {
"type": [
"number",
"string",
"null"
],
"description": "Valuation cap, e.g. 8000000 or \"$8M\". Post-money cap unless type is pre."
}
},
"additionalProperties": {}
}
},
{
"type": "string"
}
]
},
{
"type": "null"
}
],
"description": "SAFEs to convert, e.g. [{\"name\":\"Angels\",\"amount\":500000,\"valuation_cap\":8000000,\"discount\":20}] or text \"$500k at $8M post cap 20% discount; $250k MFN\"."
},
"holders": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
],
"description": "common (founders, employees; default), options (granted options), pool (unallocated option pool), preferred (prior priced rounds) or warrant. Guessed from the name when left out: a name with \"pool\" is the unallocated pool."
},
"name": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
],
"description": "Holder name, e.g. \"Alice (founder)\", \"Option pool\" or \"Seed investors\"."
},
"shares": {
"type": [
"number",
"string",
"null"
],
"description": "Shares or options held, fully diluted, e.g. 4000000 or \"4M\"."
}
},
"additionalProperties": {}
}
},
{
"type": "string"
},
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": [
"number",
"string"
]
}
}
],
"description": "Current holders with shares, fully diluted, including granted options and the unallocated pool. Array, e.g. [{\"name\":\"Alice\",\"shares\":4500000},{\"name\":\"Bob\",\"shares\":4500000},{\"name\":\"Option pool\",\"shares\":1000000,\"kind\":\"pool\"}], or text \"Alice 4.5M; Bob 4.5M; Option pool 1M\"."
},
"currency": {
"anyOf": [
{
"type": "string",
"maxLength": 3
},
{
"type": "null"
}
],
"description": "ISO currency code for labels, default USD, e.g. EUR."
},
"new_money": {
"type": [
"number",
"string",
"null"
],
"description": "Shortcut for round.new_money, e.g. 5000000."
},
"company_name": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
],
"description": "Company name for the files, e.g. \"Acme Robotics\"."
},
"pre_money_valuation": {
"type": [
"number",
"string",
"null"
],
"description": "Shortcut for round.pre_money_valuation, e.g. \"$20M\"."
},
"target_pool_percent": {
"type": [
"number",
"string",
"null"
],
"description": "Shortcut for round.target_pool_percent, e.g. 10."
}
}
}Use this when the user asks a SAFE calculator question such as how much of the company a SAFE buys: ownership = investment / post-money valuation cap for a YC post-money SAFE (or the pre-money SAFE equivalent), plus combined ownership with other SAFEs, the SAFE price and share count. Ownership is as converted at the caps, before any priced round. Does not model a priced round, notes or option pool top-ups; use calculate_cap_table for those. Not legal or tax advice.
| Argument | Type | Description |
|---|---|---|
| safe_type | any | post (YC post-money SAFE, default) or pre (pre-money SAFE). |
| investment* | number | string | SAFE investment, e.g. 500000 or "$500k". |
| other_safes | any | Other SAFEs converting alongside it, e.g. [{"amount":250000,"valuation_cap":6000000}] or "$250k at $6M cap". Combined SAFE ownership is shown. |
| valuation_cap* | number | string | Valuation cap, e.g. 10000000 or "$10M" (post-money cap unless safe_type is pre). |
| company_shares | number | string | null | Fully diluted shares before the SAFEs convert (founders, options, pool), e.g. 10000000. Used for share counts and the SAFE price; default 10,000,000. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"investment",
"valuation_cap"
],
"properties": {
"safe_type": {
"anyOf": [
{
"type": "string",
"maxLength": 20
},
{
"type": "null"
}
],
"description": "post (YC post-money SAFE, default) or pre (pre-money SAFE)."
},
"investment": {
"type": [
"number",
"string"
],
"description": "SAFE investment, e.g. 500000 or \"$500k\"."
},
"other_safes": {
"anyOf": [
{
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"properties": {
"mfn": {
"type": [
"boolean",
"string",
"null"
],
"description": "true for an MFN SAFE: it takes the lowest cap and highest discount of SAFEs listed after it."
},
"name": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
],
"description": "Investor or SAFE label, e.g. \"Angel SAFE\"."
},
"type": {
"anyOf": [
{
"type": "string",
"maxLength": 20
},
{
"type": "null"
}
],
"description": "post (YC post-money SAFE, default) or pre (pre-money SAFE)."
},
"amount": {
"type": [
"number",
"string",
"null"
],
"description": "Investment (purchase amount), e.g. 500000 or \"$500k\"."
},
"discount": {
"type": [
"number",
"string",
"null"
],
"description": "Discount in percent, e.g. 20 for 20% (a YC \"discount rate\" of 80% is read as a 20% discount)."
},
"valuation_cap": {
"type": [
"number",
"string",
"null"
],
"description": "Valuation cap, e.g. 8000000 or \"$8M\". Post-money cap unless type is pre."
}
},
"additionalProperties": {}
}
},
{
"type": "string"
}
]
},
{
"type": "null"
}
],
"description": "Other SAFEs converting alongside it, e.g. [{\"amount\":250000,\"valuation_cap\":6000000}] or \"$250k at $6M cap\". Combined SAFE ownership is shown."
},
"valuation_cap": {
"type": [
"number",
"string"
],
"description": "Valuation cap, e.g. 10000000 or \"$10M\" (post-money cap unless safe_type is pre)."
},
"company_shares": {
"type": [
"number",
"string",
"null"
],
"description": "Fully diluted shares before the SAFEs convert (founders, options, pool), e.g. 10000000. Used for share counts and the SAFE price; default 10,000,000."
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 8, 2026.