Hemrock MCP
What this MCP does
Provides financial modeling calculations for cap tables, exit waterfalls, and venture fund economics, along with modeling concepts, prompts, and validation guidance.
Tools
Input schema
{'type': 'object', 'required': ['events'], 'properties': {'events': {'type': 'array', 'items': {'oneOf': [{'$ref': '#/definitions/CommonIssuanceEvent'}, {'$ref': '#/definitions/OptionPoolEvent'}, {'$ref': '#/definitions/SecondarySaleEvent'}, {'$ref': '#/definitions/OptionGrantEvent'}, {'$ref': '#/definitions/ManualIssuanceEvent'}, {'$ref': '#/definitions/ConvertibleRoundEvent'}, {'$ref': '#/definitions/WarrantRoundEvent'}, {'$ref': '#/definitions/PricedRoundEvent'}], 'description': 'One cap-table event, discriminated by `type`. Pass events in chronological order.', 'discriminator': {'mapping': {'option_pool': '#/components/schemas/OptionPoolEvent', 'option_grant': '#/components/schemas/OptionGrantEvent', 'priced_round': '#/components/schemas/PricedRoundEvent', 'warrant_round': '#/components/schemas/WarrantRoundEvent', 'secondary_sale': '#/components/schemas/SecondarySaleEvent', 'common_issuance': '#/components/schemas/CommonIssuanceEvent', 'manual_issuance': '#/components/schemas/ManualIssuanceEvent', 'convertible_round': '#/components/schemas/ConvertibleRoundEvent'}, 'propertyName': 'type'}}, 'maxItems': 200}, 'idempotency_key': {'type': 'string', 'description': 'Optional retry key; reuse only with identical input.'}}, 'definitions': {'Error': {'type': 'object', 'properties': {'error': {'type': 'object', 'required': ['code', 'message', 'retryable'], 'properties': {'code': {'enum': ['unauthorized', 'payment_required', 'validation_failed', 'engine_error', 'quota_exhausted', 'rate_limited', 'idempotency_conflict', 'service_unavailable', 'method_not_allowed', 'internal_error'], 'type': 'string'}, 'details': {}, 'message': {'type': 'string'}, 'retryable': {'type': 'boolean'}}}}}, 'DailyUsage': {'type': 'object', 'required': ['day', 'product', 'endpoint', 'source', 'succeeded', 'failed'], 'properties': {'day': {'type': 'string', 'format': 'date'}, 'failed': {'type': 'integer'}, 'source': {'type': 'string'}, 'product': {'enum': ['cap-table', 'fund-economics'], 'type': 'string'}, 'endpoint': {'type': 'string'}, 'succeeded': {'type': 'integer'}}}, 'FundResult': {'type': 'object', 'required': ['committedCapital', 'calledCapital', 'managementFees', 'partnershipExpenses', 'investedCapital', 'proceeds', 'distributions', 'grossMultiple', 'netMultiple', 'grossIRR', 'netIRR', 'pic', 'dpi', 'rvpi', 'tvpi', 'weightedHoldPeriodYears'], 'properties': {'dpi': {'type': 'number'}, 'pic': {'type': 'number'}, 'rvpi': {'type': 'number'}, 'tvpi': {'type': 'number'}, 'tiers': {'type': 'array', 'items': {'type': 'object'}}, 'netIRR': {'$ref': '#/definitions/LineTotals'}, 'grossIRR': {'$ref': '#/definitions/LineTotals'}, 'proceeds': {'$ref': '#/definitions/LineTotals'}, 'netMultiple': {'$ref': '#/definitions/LineTotals'}, 'calledCapital': {'$ref': '#/definitions/LineTotals'}, 'distributions': {'$ref': '#/definitions/LineTotals'}, 'grossMultiple': {'$ref': '#/definitions/LineTotals'}, 'managementFees': {'$ref': '#/definitions/LineTotals'}, 'investedCapital': {'$ref': '#/definitions/LineTotals'}, 'committedCapital': {'$ref': '#/definitions/LineTotals'}, 'partnershipExpenses': {'$ref': '#/definitions/LineTotals'}, 'weightedHoldPeriodYears': {'type': 'number'}}}, 'LineTotals': {'type': 'object', 'required': ['total', 'lp', 'gp'], 'properties': {'gp': {'type': 'number'}, 'lp': {'type': 'number'}, 'total': {'type': 'number'}}}, 'UsagePeriod': {'type': 'object', 'required': ['id', 'period_start', 'period_end', 'allowance', 'consumed', 'reserved', 'enabled'], 'properties': {'id': {'type': 'string'}, 'enabled': {'type': 'boolean'}, 'consumed': {'type': 'integer'}, 'reserved': {'type': 'integer'}, 'allowance': {'type': 'integer'}, 'period_end': {'type': 'string', 'format': 'date-time'}, 'period_start': {'type': 'string', 'format': 'date-time'}}}, 'MonthlyUsage': {'type': 'object', 'required': ['month', 'product', 'succeeded', 'failed'], 'properties': {'month': {'type': 'string', 'pattern': '^[0-9]{4}-[0-9]{2}$'}, 'failed': {'type': 'integer'}, 'product': {'enum': ['cap-table', 'fund-economics'], 'type': 'string'}, 'succeeded': {'type': 'integer'}}}, 'ProductAccess': {'type': 'object', 'required': ['product', 'name', 'priceUsd', 'allowance', 'period', 'remaining', 'active'], 'properties': {'name': {'type': 'string'}, 'active': {'type': 'boolean'}, 'period': {'anyOf': [{'type': 'null'}, {'$ref': '#/definitions/UsagePeriod'}]}, 'product': {'enum': ['cap-table', 'fund-economics'], 'type': 'string'}, 'priceUsd': {'type': 'number', 'const': 20}, 'allowance': {'type': 'integer', 'const': 6000}, 'remaining': {'type': 'integer', 'minimum': 0}}}, 'AccessResponse': {'type': 'object', 'properties': {'data': {'type': 'object', 'required': ['products', 'daily'], 'properties': {'daily': {'type': 'array', 'items': {'$ref': '#/definitions/DailyUsage'}}, 'monthly': {'type': 'array', 'items': {'$ref': '#/definitions/MonthlyUsage'}}, 'periods': {'type': 'array', 'items': {'allOf': [{'$ref': '#/definitions/UsagePeriod'}, {'type': 'object', 'required': ['product'], 'properties': {'product': {'enum': ['cap-table', 'fund-economics'], 'type': 'string'}}}]}}, 'products': {'type': 'array', 'items': {'$ref': '#/definitions/ProductAccess'}}}}}}, 'ComputeRequest': {'type': 'object', 'required': ['events'], 'properties': {'events': {'type': 'array', 'items': {'oneOf': [{'$ref': '#/definitions/CommonIssuanceEvent'}, {'$ref': '#/definitions/OptionPoolEvent'}, {'$ref': '#/definitions/SecondarySaleEvent'}, {'$ref': '#/definitions/OptionGrantEvent'}, {'$ref': '#/definitions/ManualIssuanceEvent'}, {'$ref': '#/definitions/ConvertibleRoundEvent'}, {'$ref': '#/definitions/WarrantRoundEvent'}, {'$ref': '#/definitions/PricedRoundEvent'}], 'description': 'One cap-table event, discriminated by `type`. Pass events in chronological order.', 'discriminator': {'mapping': {'option_pool': '#/components/schemas/OptionPoolEvent', 'option_grant': '#/components/schemas/OptionGrantEvent', 'priced_round': '#/components/schemas/PricedRoundEvent', 'warrant_round': '#/components/schemas/WarrantRoundEvent', 'secondary_sale': '#/components/schemas/SecondarySaleEvent', 'common_issuance': '#/components/schemas/CommonIssuanceEvent', 'manual_issuance': '#/components/schemas/ManualIssuanceEvent', 'convertible_round': '#/components/schemas/ConvertibleRoundEvent'}, 'propertyName': 'type'}}, 'maxItems': 200}}, 'additionalProperties': False}, 'ResultResponse': {'type': 'object', 'properties': {'data': {'type': 'object', 'properties': {'result': {'oneOf': [{'$ref': '#/definitions/WaterfallResult'}, {'$ref': '#/definitions/FundResult'}]}}}, 'meta': {'type': 'object', 'properties': {'keyName': {'type': 'string'}}}}}, 'ComputeResponse': {'type': 'object', 'properties': {'data': {'type': 'object', 'properties': {'final': {'$ref': '#/definitions/CapTableSnapshot'}, 'snapshots': {'type': 'array', 'items': {'$ref': '#/definitions/CapTableSnapshot'}, 'description': 'One snapshot per event, in order.'}}}, 'meta': {'type': 'object', 'properties': {'keyName': {'type': 'string'}}}}}, 'OptionPoolEvent': {'type': 'object', 'required': ['type', 'label', 'shares'], 'properties': {'id': {'type': 'string', 'description': 'Pool id, so an option_grant can name which pool it draws from.'}, 'type': {'const': 'option_pool'}, 'label': {'type': 'string'}, 'shares': {'type': 'number'}, 'countMode': {'enum': ['shares', 'percent'], 'description': 'Defaults to "shares".'}, 'targetPct': {'type': 'number', 'description': '0..1 of post-event fully diluted, used when countMode="percent".'}, 'strikePrice': {'type': 'number'}}, 'description': 'Create or expand an option pool (shares authorized, not granted).'}, 'WaterfallResult': {'type': 'object', 'required': ['exitValuation', 'distributable', 'classes', 'series', 'convertibles', 'holders', 'perShare', 'iterations', 'converged'], 'properties': {'series': {'type': 'array', 'items': {'type': 'object'}}, 'classes': {'type': 'array', 'items': {'type': 'object'}}, 'holders': {'type': 'array', 'items': {'type': 'object'}}, 'perShare': {'type': 'array', 'items': {'type': 'object'}}, 'converged': {'type': 'boolean'}, 'iterations': {'type': 'integer'}, 'convertibles': {'type': 'array', 'items': {'type': 'object'}}, 'distributable': {'type': 'number'}, 'exitValuation': {'type': 'number'}}}, 'CapTableSnapshot': {'type': 'object', 'required': ['label', 'holdings', 'totalShares', 'ownership', 'outstandingConvertibles'], 'properties': {'label': {'type': 'string'}, 'holdings': {'type': 'array', 'items': {'type': 'object'}}, 'ownership': {'type': 'array', 'items': {'type': 'object'}}, 'roundDetail': {'type': 'object'}, 'totalShares': {'type': 'number'}, 'pricePerShare': {'type': 'number'}, 'outstandingConvertibles': {'type': 'array', 'items': {'type': 'object'}}}}, 'OptionGrantEvent': {'type': 'object', 'required': ['type', 'label', 'grants'], 'properties': {'type': {'const': 'option_grant'}, 'label': {'type': 'string'}, 'grants': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'shares'], 'properties': {'id': {'type': 'string'}, 'name': {'type': 'string'}, 'shares': {'type': 'number'}}}}, 'poolId': {'type': 'string', 'description': 'Pool id to grant from; omit to draw the common pool.'}}, 'description': 'Grant options to people from one pool (fully-diluted-neutral).'}, 'PricedRoundEvent': {'type': 'object', 'required': ['type', 'label', 'preMoneyValuation', 'investments'], 'properties': {'type': {'const': 'priced_round'}, 'label': {'type': 'string'}, 'pools': {'type': 'array', 'items': {'type': 'object', 'required': ['mode'], 'properties': {'pct': {'type': 'number', 'description': '0..1 of post-money fully diluted, when countMode="percent".'}, 'mode': {'enum': ['pre', 'post'], 'description': '"pre" dilutes existing only; "post" dilutes new money too.'}, 'label': {'type': 'string'}, 'poolId': {'type': 'string', 'description': 'Set to track this pool separately (its own cap-table row).'}, 'shares': {'type': 'number'}, 'countMode': {'enum': ['shares', 'percent'], 'description': 'Defaults to "percent".'}}}, 'description': 'Option pool top-ups for the round (preferred over the legacy targetPoolPct trio).'}, 'poolMode': {'enum': ['pre', 'post', 'custom'], 'description': 'Legacy. Prefer pools[].'}, 'investments': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'amount'], 'properties': {'id': {'type': 'string'}, 'name': {'type': 'string'}, 'amount': {'type': 'number'}, 'proRata': {'type': 'boolean', 'description': 'If true, amount is back-solved to hold pre-round ownership; match by id.'}, 'antiDilution': {'enum': ['weighted-average', 'full-ratchet']}, 'antiDilutionMethod': {'enum': ['conversion-ratio', 'new-shares'], 'description': 'Defaults to "conversion-ratio".'}}}}, 'poolPostPct': {'type': 'number', 'description': 'Legacy. Prefer pools[].'}, 'targetPoolPct': {'type': 'number', 'description': 'Legacy. Prefer pools[].'}, 'preMoneyValuation': {'type': 'number'}}, 'description': 'A priced equity round: new money buys newly issued preferred.'}, 'WarrantRoundEvent': {'type': 'object', 'required': ['type', 'label', 'warrants'], 'properties': {'type': {'const': 'warrant_round'}, 'label': {'type': 'string'}, 'warrants': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'purchaseClass', 'countMode'], 'properties': {'id': {'type': 'string'}, 'name': {'type': 'string'}, 'shares': {'type': 'number', 'description': 'When countMode="shares".'}, 'parValue': {'type': 'number'}, 'countMode': {'enum': ['shares', 'value']}, 'totalValue': {'type': 'number', 'description': 'When countMode="value": shares = totalValue / purchasePrice.'}, 'priceDiscount': {'type': 'number', 'description': '0..1 discount on the source round price.'}, 'purchaseClass': {'enum': ['common', 'preferred']}, 'purchasePrice': {'type': 'number'}, 'purchaseRound': {'type': 'string', 'description': 'For a preferred warrant, the series it targets.'}, 'priceFromRound': {'type': 'string', 'description': 'Source round label to price off, when variable.'}}}}}, 'description': 'Issue warrants (right to buy shares at a set price); counts toward fully diluted now.'}, 'FundComputeRequest': {'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['inputs'], 'properties': {'inputs': {'type': 'object', 'required': ['committedCapital', 'gpCommitPct', 'gpCommitCountedTowardInvested', 'organizationalExpenses', 'operationalExpensesAnnual', 'mgmtFeePct', 'recycledCapitalPct', 'carryPct', 'newInvestmentPeriodYears', 'mgmtFeesPeriodYears', 'portfolio', 'returnTiers'], 'properties': {'carryPct': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'portfolio': {'type': 'object', 'required': ['newPct', 'followPct', 'avgCheckSizeNew', 'avgCheckSizeFollow'], 'properties': {'newPct': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'followPct': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'entryStages': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'numInvestments', 'avgCheckSize'], 'properties': {'name': {'type': 'string'}, 'avgCheckSize': {'type': 'number', 'minimum': 0}, 'reserveRatio': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'pctAllocation': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'followOnChecks': {'type': 'array', 'items': {'type': 'object', 'required': ['avgCheckSize'], 'properties': {'label': {'type': 'string'}, 'avgCheckSize': {'type': 'number', 'minimum': 0}, 'pctOfReserve': {'type': 'number', 'maximum': 1, 'minimum': 0}}, 'additionalProperties': False}}, 'numInvestments': {'type': 'number', 'minimum': 0}, 'initialCheckLabel': {'type': 'string'}}, 'additionalProperties': False}}, 'avgCheckSizeNew': {'type': 'number', 'minimum': 0}, 'avgCheckSizeFollow': {'type': 'number', 'minimum': 0}}, 'additionalProperties': False}, 'mgmtFeePct': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'gpCommitPct': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'returnTiers': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'pctOfCapital', 'multiple', 'holdingPeriodYears'], 'properties': {'name': {'type': 'string', 'minLength': 1}, 'multiple': {'type': 'number', 'minimum': 0}, 'numCompanies': {'type': 'number', 'minimum': 0}, 'pctOfCapital': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'holdingPeriodYears': {'type': 'number', 'minimum': 0}}, 'additionalProperties': False}, 'minItems': 1}, 'tierInputMode': {'enum': ['pct-capital', 'num-companies'], 'type': 'string'}, 'stageInputMode': {'enum': ['pct-capital', 'num-companies'], 'type': 'string'}, 'tierFractional': {'type': 'boolean'}, 'mgmtFeeSchedule': {'type': 'array', 'items': {'type': 'number', 'maximum': 1, 'minimum': 0}}, 'committedCapital': {'type': 'number', 'exclusiveMinimum': 0}, 'recycledCapitalPct': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'fundOperationsYears': {'type': 'number', 'exclusiveMinimum': 0}, 'mgmtFeesPeriodYears': {'type': 'number', 'exclusiveMinimum': 0}, 'organizationalExpenses': {'type': 'number', 'minimum': 0}, 'targetTotalInvestments': {'type': 'number', 'minimum': 0}, 'operationalExpenseLines': {'type': 'array', 'items': {'type': 'object', 'required': ['label', 'amount'], 'properties': {'label': {'type': 'string'}, 'amount': {'type': 'number', 'minimum': 0}}, 'additionalProperties': False}}, 'partnershipExpenseLines': {'type': 'array', 'items': {'type': 'object', 'required': ['label', 'amount'], 'properties': {'label': {'type': 'string'}, 'amount': {'type': 'number', 'minimum': 0}}, 'additionalProperties': False}}, 'newInvestmentPeriodYears': {'type': 'number', 'exclusiveMinimum': 0}, 'operationalExpensesAnnual': {'type': 'number', 'minimum': 0}, 'partnershipExpensesAnnual': {'type': 'number', 'minimum': 0}, 'solveCalledFromDeployment': {'type': 'boolean'}, 'organizationalExpenseLines': {'type': 'array', 'items': {'type': 'object', 'required': ['label', 'amount'], 'properties': {'label': {'type': 'string'}, 'amount': {'type': 'number', 'minimum': 0}}, 'additionalProperties': False}}, 'operationalExpensesBreakout': {'type': 'object', 'required': ['fundAdmin', 'tax', 'audit', 'other'], 'properties': {'tax': {'type': 'number', 'minimum': 0}, 'audit': {'type': 'number', 'minimum': 0}, 'other': {'type': 'number', 'minimum': 0}, 'fundAdmin': {'type': 'number', 'minimum': 0}}, 'additionalProperties': False}, 'gpCommitCountedTowardInvested': {'type': 'boolean'}}, 'additionalProperties': False}}, 'additionalProperties': False}, 'SecondarySaleEvent': {'type': 'object', 'required': ['type', 'label', 'fromId', 'toId', 'toName', 'shares'], 'properties': {'toId': {'type': 'string'}, 'type': {'const': 'secondary_sale'}, 'class': {'enum': ['common', 'preferred', 'option-pool', 'warrant'], 'description': 'Defaults to "common".'}, 'label': {'type': 'string'}, 'round': {'type': 'string', 'description': 'Which series the shares come from (e.g. "Series A").'}, 'fromId': {'type': 'string'}, 'shares': {'type': 'number'}, 'toName': {'type': 'string'}}, 'description': 'Transfer existing shares from one holder to another.'}, 'CommonIssuanceEvent': {'type': 'object', 'required': ['type', 'label', 'grants'], 'properties': {'type': {'const': 'common_issuance'}, 'label': {'type': 'string'}, 'grants': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'kind', 'shares'], 'properties': {'id': {'type': 'string'}, 'kind': {'enum': ['founder', 'employee']}, 'name': {'type': 'string'}, 'shares': {'type': 'number'}}}}}, 'description': 'Issue common stock (founders, employees).'}, 'ManualIssuanceEvent': {'type': 'object', 'required': ['type', 'label', 'issuances'], 'properties': {'type': {'const': 'manual_issuance'}, 'label': {'type': 'string'}, 'issuances': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'kind', 'class', 'shares'], 'properties': {'id': {'type': 'string'}, 'kind': {'enum': ['founder', 'employee', 'investor', 'pool']}, 'name': {'type': 'string'}, 'class': {'enum': ['common', 'preferred', 'option-pool', 'warrant']}, 'shares': {'type': 'number'}, 'pctBasis': {'enum': ['fully-diluted', 'issued'], 'description': 'Defaults to "fully-diluted".'}, 'countMode': {'enum': ['shares', 'percent'], 'description': 'Defaults to "shares".'}, 'targetPct': {'type': 'number', 'description': '0..1, used when countMode="percent".'}, 'issuePrice': {'type': 'number'}}}}}, 'description': 'Escape hatch: issue exact shares for custom arrangements.'}, 'ConvertibleRoundEvent': {'type': 'object', 'required': ['type', 'label', 'convertibles'], 'properties': {'type': {'const': 'convertible_round'}, 'label': {'type': 'string'}, 'convertibles': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'kind', 'principal'], 'properties': {'id': {'type': 'string'}, 'mfn': {'type': 'boolean'}, 'kind': {'enum': ['safe', 'note']}, 'name': {'type': 'string'}, 'capType': {'enum': ['pre-money', 'post-money', 'post-money-fixed', 'post-money-fixed-after']}, 'discount': {'type': 'number', 'description': '0..1.'}, 'principal': {'type': 'number'}, 'dilutionMode': {'enum': ['existing-only', 'all'], 'description': 'Defaults to "existing-only".'}, 'interestRate': {'type': 'number', 'description': 'Annual fraction (0.05 = 5%). Notes only.'}, 'valuationCap': {'type': 'number'}, 'conversionDate': {'type': 'string', 'description': 'ISO date. Notes only.'}, 'investmentDate': {'type': 'string', 'description': 'ISO date. Notes only.'}, 'accruedInterest': {'type': 'number'}}}}}, 'description': 'Issue SAFEs or notes; they convert to preferred at the next priced round.'}, 'WaterfallComputeRequest': {'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['exitValuation', 'model'], 'properties': {'model': {'type': 'object', 'required': ['common', 'preferred'], 'properties': {'debt': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'common': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'shares'], 'properties': {'id': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'name': {'type': 'string', 'maxLength': 200}, 'shares': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'invested': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 500}, 'options': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'shares', 'strike'], 'properties': {'id': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'name': {'type': 'string', 'maxLength': 200}, 'shares': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'strike': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'vestedFraction': {'type': 'number', 'maximum': 1, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 500}, 'warrants': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'shares', 'strike'], 'properties': {'id': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'name': {'type': 'string', 'maxLength': 200}, 'shares': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'strike': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 500}, 'preferred': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'holders', 'seniority'], 'properties': {'id': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'name': {'type': 'string', 'maxLength': 200}, 'holders': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'shares', 'invested'], 'properties': {'id': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'name': {'type': 'string', 'maxLength': 200}, 'shares': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'invested': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 500}, 'multiple': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'seniority': {'type': 'number'}, 'dividendRate': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'dividendStart': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$'}, 'participation': {'enum': ['none', 'full', 'capped'], 'type': 'string'}, 'investmentDate': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$'}, 'conversionRatio': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0, 'exclusiveMinimum': 0}, 'participationCap': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'dividendCumulative': {'type': 'boolean'}}, 'additionalProperties': False}, 'maxItems': 20}, 'convertibles': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'kind', 'principal'], 'properties': {'id': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'cap': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0, 'exclusiveMinimum': 0}, 'kind': {'enum': ['pre-safe', 'post-safe', 'note'], 'type': 'string'}, 'name': {'type': 'string', 'maxLength': 200}, 'discount': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'cashOutAs': {'enum': ['debt', 'equity'], 'type': 'string'}, 'principal': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'seniority': {'type': 'number'}, 'accruedInterest': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'premiumMultiple': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'cashOutSeniority': {'enum': ['senior', 'pari-passu'], 'type': 'string'}}, 'additionalProperties': False}, 'maxItems': 100}, 'unissuedPool': {'type': 'object', 'required': ['shares'], 'properties': {'shares': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'treatment': {'type': 'string', 'const': 'cancel'}}, 'additionalProperties': False}, 'transactionExpenses': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}}, 'additionalProperties': False}, 'exitValuation': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}}, 'additionalProperties': False}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['exitValuation', 'model'], 'properties': {'model': {'type': 'object', 'required': ['common', 'preferred'], 'properties': {'debt': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'common': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'shares'], 'properties': {'id': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'name': {'type': 'string', 'maxLength': 200}, 'shares': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'invested': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 500}, 'options': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'shares', 'strike'], 'properties': {'id': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'name': {'type': 'string', 'maxLength': 200}, 'shares': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'strike': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'vestedFraction': {'type': 'number', 'maximum': 1, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 500}, 'warrants': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'shares', 'strike'], 'properties': {'id': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'name': {'type': 'string', 'maxLength': 200}, 'shares': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'strike': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 500}, 'preferred': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'holders', 'seniority'], 'properties': {'id': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'name': {'type': 'string', 'maxLength': 200}, 'holders': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'shares', 'invested'], 'properties': {'id': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'name': {'type': 'string', 'maxLength': 200}, 'shares': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'invested': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 500}, 'multiple': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'seniority': {'type': 'number'}, 'dividendRate': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'dividendStart': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$'}, 'participation': {'enum': ['none', 'full', 'capped'], 'type': 'string'}, 'investmentDate': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$'}, 'conversionRatio': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0, 'exclusiveMinimum': 0}, 'participationCap': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'dividendCumulative': {'type': 'boolean'}}, 'additionalProperties': False}, 'maxItems': 20}, 'convertibles': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'kind', 'principal'], 'properties': {'id': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'cap': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0, 'exclusiveMinimum': 0}, 'kind': {'enum': ['pre-safe', 'post-safe', 'note'], 'type': 'string'}, 'name': {'type': 'string', 'maxLength': 200}, 'discount': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'cashOutAs': {'enum': ['debt', 'equity'], 'type': 'string'}, 'principal': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'seniority': {'type': 'number'}, 'accruedInterest': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'premiumMultiple': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'cashOutSeniority': {'enum': ['senior', 'pari-passu'], 'type': 'string'}}, 'additionalProperties': False}, 'maxItems': 100}, 'unissuedPool': {'type': 'object', 'required': ['shares'], 'properties': {'shares': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'treatment': {'type': 'string', 'const': 'cancel'}}, 'additionalProperties': False}, 'transactionExpenses': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}}, 'additionalProperties': False}, 'exitValuation': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'idempotency_key': {'type': 'string', 'description': 'Optional retry key; reuse only with identical input.'}}, 'definitions': {'Error': {'type': 'object', 'properties': {'error': {'type': 'object', 'required': ['code', 'message', 'retryable'], 'properties': {'code': {'enum': ['unauthorized', 'payment_required', 'validation_failed', 'engine_error', 'quota_exhausted', 'rate_limited', 'idempotency_conflict', 'service_unavailable', 'method_not_allowed', 'internal_error'], 'type': 'string'}, 'details': {}, 'message': {'type': 'string'}, 'retryable': {'type': 'boolean'}}}}}, 'DailyUsage': {'type': 'object', 'required': ['day', 'product', 'endpoint', 'source', 'succeeded', 'failed'], 'properties': {'day': {'type': 'string', 'format': 'date'}, 'failed': {'type': 'integer'}, 'source': {'type': 'string'}, 'product': {'enum': ['cap-table', 'fund-economics'], 'type': 'string'}, 'endpoint': {'type': 'string'}, 'succeeded': {'type': 'integer'}}}, 'FundResult': {'type': 'object', 'required': ['committedCapital', 'calledCapital', 'managementFees', 'partnershipExpenses', 'investedCapital', 'proceeds', 'distributions', 'grossMultiple', 'netMultiple', 'grossIRR', 'netIRR', 'pic', 'dpi', 'rvpi', 'tvpi', 'weightedHoldPeriodYears'], 'properties': {'dpi': {'type': 'number'}, 'pic': {'type': 'number'}, 'rvpi': {'type': 'number'}, 'tvpi': {'type': 'number'}, 'tiers': {'type': 'array', 'items': {'type': 'object'}}, 'netIRR': {'$ref': '#/definitions/LineTotals'}, 'grossIRR': {'$ref': '#/definitions/LineTotals'}, 'proceeds': {'$ref': '#/definitions/LineTotals'}, 'netMultiple': {'$ref': '#/definitions/LineTotals'}, 'calledCapital': {'$ref': '#/definitions/LineTotals'}, 'distributions': {'$ref': '#/definitions/LineTotals'}, 'grossMultiple': {'$ref': '#/definitions/LineTotals'}, 'managementFees': {'$ref': '#/definitions/LineTotals'}, 'investedCapital': {'$ref': '#/definitions/LineTotals'}, 'committedCapital': {'$ref': '#/definitions/LineTotals'}, 'partnershipExpenses': {'$ref': '#/definitions/LineTotals'}, 'weightedHoldPeriodYears': {'type': 'number'}}}, 'LineTotals': {'type': 'object', 'required': ['total', 'lp', 'gp'], 'properties': {'gp': {'type': 'number'}, 'lp': {'type': 'number'}, 'total': {'type': 'number'}}}, 'UsagePeriod': {'type': 'object', 'required': ['id', 'period_start', 'period_end', 'allowance', 'consumed', 'reserved', 'enabled'], 'properties': {'id': {'type': 'string'}, 'enabled': {'type': 'boolean'}, 'consumed': {'type': 'integer'}, 'reserved': {'type': 'integer'}, 'allowance': {'type': 'integer'}, 'period_end': {'type': 'string', 'format': 'date-time'}, 'period_start': {'type': 'string', 'format': 'date-time'}}}, 'MonthlyUsage': {'type': 'object', 'required': ['month', 'product', 'succeeded', 'failed'], 'properties': {'month': {'type': 'string', 'pattern': '^[0-9]{4}-[0-9]{2}$'}, 'failed': {'type': 'integer'}, 'product': {'enum': ['cap-table', 'fund-economics'], 'type': 'string'}, 'succeeded': {'type': 'integer'}}}, 'ProductAccess': {'type': 'object', 'required': ['product', 'name', 'priceUsd', 'allowance', 'period', 'remaining', 'active'], 'properties': {'name': {'type': 'string'}, 'active': {'type': 'boolean'}, 'period': {'anyOf': [{'type': 'null'}, {'$ref': '#/definitions/UsagePeriod'}]}, 'product': {'enum': ['cap-table', 'fund-economics'], 'type': 'string'}, 'priceUsd': {'type': 'number', 'const': 20}, 'allowance': {'type': 'integer', 'const': 6000}, 'remaining': {'type': 'integer', 'minimum': 0}}}, 'AccessResponse': {'type': 'object', 'properties': {'data': {'type': 'object', 'required': ['products', 'daily'], 'properties': {'daily': {'type': 'array', 'items': {'$ref': '#/definitions/DailyUsage'}}, 'monthly': {'type': 'array', 'items': {'$ref': '#/definitions/MonthlyUsage'}}, 'periods': {'type': 'array', 'items': {'allOf': [{'$ref': '#/definitions/UsagePeriod'}, {'type': 'object', 'required': ['product'], 'properties': {'product': {'enum': ['cap-table', 'fund-economics'], 'type': 'string'}}}]}}, 'products': {'type': 'array', 'items': {'$ref': '#/definitions/ProductAccess'}}}}}}, 'ComputeRequest': {'type': 'object', 'required': ['events'], 'properties': {'events': {'type': 'array', 'items': {'oneOf': [{'$ref': '#/definitions/CommonIssuanceEvent'}, {'$ref': '#/definitions/OptionPoolEvent'}, {'$ref': '#/definitions/SecondarySaleEvent'}, {'$ref': '#/definitions/OptionGrantEvent'}, {'$ref': '#/definitions/ManualIssuanceEvent'}, {'$ref': '#/definitions/ConvertibleRoundEvent'}, {'$ref': '#/definitions/WarrantRoundEvent'}, {'$ref': '#/definitions/PricedRoundEvent'}], 'description': 'One cap-table event, discriminated by `type`. Pass events in chronological order.', 'discriminator': {'mapping': {'option_pool': '#/components/schemas/OptionPoolEvent', 'option_grant': '#/components/schemas/OptionGrantEvent', 'priced_round': '#/components/schemas/PricedRoundEvent', 'warrant_round': '#/components/schemas/WarrantRoundEvent', 'secondary_sale': '#/components/schemas/SecondarySaleEvent', 'common_issuance': '#/components/schemas/CommonIssuanceEvent', 'manual_issuance': '#/components/schemas/ManualIssuanceEvent', 'convertible_round': '#/components/schemas/ConvertibleRoundEvent'}, 'propertyName': 'type'}}, 'maxItems': 200}}, 'additionalProperties': False}, 'ResultResponse': {'type': 'object', 'properties': {'data': {'type': 'object', 'properties': {'result': {'oneOf': [{'$ref': '#/definitions/WaterfallResult'}, {'$ref': '#/definitions/FundResult'}]}}}, 'meta': {'type': 'object', 'properties': {'keyName': {'type': 'string'}}}}}, 'ComputeResponse': {'type': 'object', 'properties': {'data': {'type': 'object', 'properties': {'final': {'$ref': '#/definitions/CapTableSnapshot'}, 'snapshots': {'type': 'array', 'items': {'$ref': '#/definitions/CapTableSnapshot'}, 'description': 'One snapshot per event, in order.'}}}, 'meta': {'type': 'object', 'properties': {'keyName': {'type': 'string'}}}}}, 'OptionPoolEvent': {'type': 'object', 'required': ['type', 'label', 'shares'], 'properties': {'id': {'type': 'string', 'description': 'Pool id, so an option_grant can name which pool it draws from.'}, 'type': {'const': 'option_pool'}, 'label': {'type': 'string'}, 'shares': {'type': 'number'}, 'countMode': {'enum': ['shares', 'percent'], 'description': 'Defaults to "shares".'}, 'targetPct': {'type': 'number', 'description': '0..1 of post-event fully diluted, used when countMode="percent".'}, 'strikePrice': {'type': 'number'}}, 'description': 'Create or expand an option pool (shares authorized, not granted).'}, 'WaterfallResult': {'type': 'object', 'required': ['exitValuation', 'distributable', 'classes', 'series', 'convertibles', 'holders', 'perShare', 'iterations', 'converged'], 'properties': {'series': {'type': 'array', 'items': {'type': 'object'}}, 'classes': {'type': 'array', 'items': {'type': 'object'}}, 'holders': {'type': 'array', 'items': {'type': 'object'}}, 'perShare': {'type': 'array', 'items': {'type': 'object'}}, 'converged': {'type': 'boolean'}, 'iterations': {'type': 'integer'}, 'convertibles': {'type': 'array', 'items': {'type': 'object'}}, 'distributable': {'type': 'number'}, 'exitValuation': {'type': 'number'}}}, 'CapTableSnapshot': {'type': 'object', 'required': ['label', 'holdings', 'totalShares', 'ownership', 'outstandingConvertibles'], 'properties': {'label': {'type': 'string'}, 'holdings': {'type': 'array', 'items': {'type': 'object'}}, 'ownership': {'type': 'array', 'items': {'type': 'object'}}, 'roundDetail': {'type': 'object'}, 'totalShares': {'type': 'number'}, 'pricePerShare': {'type': 'number'}, 'outstandingConvertibles': {'type': 'array', 'items': {'type': 'object'}}}}, 'OptionGrantEvent': {'type': 'object', 'required': ['type', 'label', 'grants'], 'properties': {'type': {'const': 'option_grant'}, 'label': {'type': 'string'}, 'grants': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'shares'], 'properties': {'id': {'type': 'string'}, 'name': {'type': 'string'}, 'shares': {'type': 'number'}}}}, 'poolId': {'type': 'string', 'description': 'Pool id to grant from; omit to draw the common pool.'}}, 'description': 'Grant options to people from one pool (fully-diluted-neutral).'}, 'PricedRoundEvent': {'type': 'object', 'required': ['type', 'label', 'preMoneyValuation', 'investments'], 'properties': {'type': {'const': 'priced_round'}, 'label': {'type': 'string'}, 'pools': {'type': 'array', 'items': {'type': 'object', 'required': ['mode'], 'properties': {'pct': {'type': 'number', 'description': '0..1 of post-money fully diluted, when countMode="percent".'}, 'mode': {'enum': ['pre', 'post'], 'description': '"pre" dilutes existing only; "post" dilutes new money too.'}, 'label': {'type': 'string'}, 'poolId': {'type': 'string', 'description': 'Set to track this pool separately (its own cap-table row).'}, 'shares': {'type': 'number'}, 'countMode': {'enum': ['shares', 'percent'], 'description': 'Defaults to "percent".'}}}, 'description': 'Option pool top-ups for the round (preferred over the legacy targetPoolPct trio).'}, 'poolMode': {'enum': ['pre', 'post', 'custom'], 'description': 'Legacy. Prefer pools[].'}, 'investments': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'amount'], 'properties': {'id': {'type': 'string'}, 'name': {'type': 'string'}, 'amount': {'type': 'number'}, 'proRata': {'type': 'boolean', 'description': 'If true, amount is back-solved to hold pre-round ownership; match by id.'}, 'antiDilution': {'enum': ['weighted-average', 'full-ratchet']}, 'antiDilutionMethod': {'enum': ['conversion-ratio', 'new-shares'], 'description': 'Defaults to "conversion-ratio".'}}}}, 'poolPostPct': {'type': 'number', 'description': 'Legacy. Prefer pools[].'}, 'targetPoolPct': {'type': 'number', 'description': 'Legacy. Prefer pools[].'}, 'preMoneyValuation': {'type': 'number'}}, 'description': 'A priced equity round: new money buys newly issued preferred.'}, 'WarrantRoundEvent': {'type': 'object', 'required': ['type', 'label', 'warrants'], 'properties': {'type': {'const': 'warrant_round'}, 'label': {'type': 'string'}, 'warrants': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'purchaseClass', 'countMode'], 'properties': {'id': {'type': 'string'}, 'name': {'type': 'string'}, 'shares': {'type': 'number', 'description': 'When countMode="shares".'}, 'parValue': {'type': 'number'}, 'countMode': {'enum': ['shares', 'value']}, 'totalValue': {'type': 'number', 'description': 'When countMode="value": shares = totalValue / purchasePrice.'}, 'priceDiscount': {'type': 'number', 'description': '0..1 discount on the source round price.'}, 'purchaseClass': {'enum': ['common', 'preferred']}, 'purchasePrice': {'type': 'number'}, 'purchaseRound': {'type': 'string', 'description': 'For a preferred warrant, the series it targets.'}, 'priceFromRound': {'type': 'string', 'description': 'Source round label to price off, when variable.'}}}}}, 'description': 'Issue warrants (right to buy shares at a set price); counts toward fully diluted now.'}, 'FundComputeRequest': {'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['inputs'], 'properties': {'inputs': {'type': 'object', 'required': ['committedCapital', 'gpCommitPct', 'gpCommitCountedTowardInvested', 'organizationalExpenses', 'operationalExpensesAnnual', 'mgmtFeePct', 'recycledCapitalPct', 'carryPct', 'newInvestmentPeriodYears', 'mgmtFeesPeriodYears', 'portfolio', 'returnTiers'], 'properties': {'carryPct': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'portfolio': {'type': 'object', 'required': ['newPct', 'followPct', 'avgCheckSizeNew', 'avgCheckSizeFollow'], 'properties': {'newPct': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'followPct': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'entryStages': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'numInvestments', 'avgCheckSize'], 'properties': {'name': {'type': 'string'}, 'avgCheckSize': {'type': 'number', 'minimum': 0}, 'reserveRatio': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'pctAllocation': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'followOnChecks': {'type': 'array', 'items': {'type': 'object', 'required': ['avgCheckSize'], 'properties': {'label': {'type': 'string'}, 'avgCheckSize': {'type': 'number', 'minimum': 0}, 'pctOfReserve': {'type': 'number', 'maximum': 1, 'minimum': 0}}, 'additionalProperties': False}}, 'numInvestments': {'type': 'number', 'minimum': 0}, 'initialCheckLabel': {'type': 'string'}}, 'additionalProperties': False}}, 'avgCheckSizeNew': {'type': 'number', 'minimum': 0}, 'avgCheckSizeFollow': {'type': 'number', 'minimum': 0}}, 'additionalProperties': False}, 'mgmtFeePct': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'gpCommitPct': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'returnTiers': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'pctOfCapital', 'multiple', 'holdingPeriodYears'], 'properties': {'name': {'type': 'string', 'minLength': 1}, 'multiple': {'type': 'number', 'minimum': 0}, 'numCompanies': {'type': 'number', 'minimum': 0}, 'pctOfCapital': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'holdingPeriodYears': {'type': 'number', 'minimum': 0}}, 'additionalProperties': False}, 'minItems': 1}, 'tierInputMode': {'enum': ['pct-capital', 'num-companies'], 'type': 'string'}, 'stageInputMode': {'enum': ['pct-capital', 'num-companies'], 'type': 'string'}, 'tierFractional': {'type': 'boolean'}, 'mgmtFeeSchedule': {'type': 'array', 'items': {'type': 'number', 'maximum': 1, 'minimum': 0}}, 'committedCapital': {'type': 'number', 'exclusiveMinimum': 0}, 'recycledCapitalPct': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'fundOperationsYears': {'type': 'number', 'exclusiveMinimum': 0}, 'mgmtFeesPeriodYears': {'type': 'number', 'exclusiveMinimum': 0}, 'organizationalExpenses': {'type': 'number', 'minimum': 0}, 'targetTotalInvestments': {'type': 'number', 'minimum': 0}, 'operationalExpenseLines': {'type': 'array', 'items': {'type': 'object', 'required': ['label', 'amount'], 'properties': {'label': {'type': 'string'}, 'amount': {'type': 'number', 'minimum': 0}}, 'additionalProperties': False}}, 'partnershipExpenseLines': {'type': 'array', 'items': {'type': 'object', 'required': ['label', 'amount'], 'properties': {'label': {'type': 'string'}, 'amount': {'type': 'number', 'minimum': 0}}, 'additionalProperties': False}}, 'newInvestmentPeriodYears': {'type': 'number', 'exclusiveMinimum': 0}, 'operationalExpensesAnnual': {'type': 'number', 'minimum': 0}, 'partnershipExpensesAnnual': {'type': 'number', 'minimum': 0}, 'solveCalledFromDeployment': {'type': 'boolean'}, 'organizationalExpenseLines': {'type': 'array', 'items': {'type': 'object', 'required': ['label', 'amount'], 'properties': {'label': {'type': 'string'}, 'amount': {'type': 'number', 'minimum': 0}}, 'additionalProperties': False}}, 'operationalExpensesBreakout': {'type': 'object', 'required': ['fundAdmin', 'tax', 'audit', 'other'], 'properties': {'tax': {'type': 'number', 'minimum': 0}, 'audit': {'type': 'number', 'minimum': 0}, 'other': {'type': 'number', 'minimum': 0}, 'fundAdmin': {'type': 'number', 'minimum': 0}}, 'additionalProperties': False}, 'gpCommitCountedTowardInvested': {'type': 'boolean'}}, 'additionalProperties': False}}, 'additionalProperties': False}, 'SecondarySaleEvent': {'type': 'object', 'required': ['type', 'label', 'fromId', 'toId', 'toName', 'shares'], 'properties': {'toId': {'type': 'string'}, 'type': {'const': 'secondary_sale'}, 'class': {'enum': ['common', 'preferred', 'option-pool', 'warrant'], 'description': 'Defaults to "common".'}, 'label': {'type': 'string'}, 'round': {'type': 'string', 'description': 'Which series the shares come from (e.g. "Series A").'}, 'fromId': {'type': 'string'}, 'shares': {'type': 'number'}, 'toName': {'type': 'string'}}, 'description': 'Transfer existing shares from one holder to another.'}, 'CommonIssuanceEvent': {'type': 'object', 'required': ['type', 'label', 'grants'], 'properties': {'type': {'const': 'common_issuance'}, 'label': {'type': 'string'}, 'grants': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'kind', 'shares'], 'properties': {'id': {'type': 'string'}, 'kind': {'enum': ['founder', 'employee']}, 'name': {'type': 'string'}, 'shares': {'type': 'number'}}}}}, 'description': 'Issue common stock (founders, employees).'}, 'ManualIssuanceEvent': {'type': 'object', 'required': ['type', 'label', 'issuances'], 'properties': {'type': {'const': 'manual_issuance'}, 'label': {'type': 'string'}, 'issuances': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'kind', 'class', 'shares'], 'properties': {'id': {'type': 'string'}, 'kind': {'enum': ['founder', 'employee', 'investor', 'pool']}, 'name': {'type': 'string'}, 'class': {'enum': ['common', 'preferred', 'option-pool', 'warrant']}, 'shares': {'type': 'number'}, 'pctBasis': {'enum': ['fully-diluted', 'issued'], 'description': 'Defaults to "fully-diluted".'}, 'countMode': {'enum': ['shares', 'percent'], 'description': 'Defaults to "shares".'}, 'targetPct': {'type': 'number', 'description': '0..1, used when countMode="percent".'}, 'issuePrice': {'type': 'number'}}}}}, 'description': 'Escape hatch: issue exact shares for custom arrangements.'}, 'ConvertibleRoundEvent': {'type': 'object', 'required': ['type', 'label', 'convertibles'], 'properties': {'type': {'const': 'convertible_round'}, 'label': {'type': 'string'}, 'convertibles': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'kind', 'principal'], 'properties': {'id': {'type': 'string'}, 'mfn': {'type': 'boolean'}, 'kind': {'enum': ['safe', 'note']}, 'name': {'type': 'string'}, 'capType': {'enum': ['pre-money', 'post-money', 'post-money-fixed', 'post-money-fixed-after']}, 'discount': {'type': 'number', 'description': '0..1.'}, 'principal': {'type': 'number'}, 'dilutionMode': {'enum': ['existing-only', 'all'], 'description': 'Defaults to "existing-only".'}, 'interestRate': {'type': 'number', 'description': 'Annual fraction (0.05 = 5%). Notes only.'}, 'valuationCap': {'type': 'number'}, 'conversionDate': {'type': 'string', 'description': 'ISO date. Notes only.'}, 'investmentDate': {'type': 'string', 'description': 'ISO date. Notes only.'}, 'accruedInterest': {'type': 'number'}}}}}, 'description': 'Issue SAFEs or notes; they convert to preferred at the next priced round.'}, 'WaterfallComputeRequest': {'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['exitValuation', 'model'], 'properties': {'model': {'type': 'object', 'required': ['common', 'preferred'], 'properties': {'debt': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'common': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'shares'], 'properties': {'id': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'name': {'type': 'string', 'maxLength': 200}, 'shares': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'invested': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 500}, 'options': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'shares', 'strike'], 'properties': {'id': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'name': {'type': 'string', 'maxLength': 200}, 'shares': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'strike': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'vestedFraction': {'type': 'number', 'maximum': 1, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 500}, 'warrants': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'shares', 'strike'], 'properties': {'id': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'name': {'type': 'string', 'maxLength': 200}, 'shares': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'strike': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 500}, 'preferred': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'holders', 'seniority'], 'properties': {'id': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'name': {'type': 'string', 'maxLength': 200}, 'holders': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'shares', 'invested'], 'properties': {'id': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'name': {'type': 'string', 'maxLength': 200}, 'shares': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'invested': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 500}, 'multiple': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'seniority': {'type': 'number'}, 'dividendRate': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'dividendStart': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$'}, 'participation': {'enum': ['none', 'full', 'capped'], 'type': 'string'}, 'investmentDate': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$'}, 'conversionRatio': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0, 'exclusiveMinimum': 0}, 'participationCap': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'dividendCumulative': {'type': 'boolean'}}, 'additionalProperties': False}, 'maxItems': 20}, 'convertibles': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'kind', 'principal'], 'properties': {'id': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'cap': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0, 'exclusiveMinimum': 0}, 'kind': {'enum': ['pre-safe', 'post-safe', 'note'], 'type': 'string'}, 'name': {'type': 'string', 'maxLength': 200}, 'discount': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'cashOutAs': {'enum': ['debt', 'equity'], 'type': 'string'}, 'principal': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'seniority': {'type': 'number'}, 'accruedInterest': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'premiumMultiple': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'cashOutSeniority': {'enum': ['senior', 'pari-passu'], 'type': 'string'}}, 'additionalProperties': False}, 'maxItems': 100}, 'unissuedPool': {'type': 'object', 'required': ['shares'], 'properties': {'shares': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'treatment': {'type': 'string', 'const': 'cancel'}}, 'additionalProperties': False}, 'transactionExpenses': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}}, 'additionalProperties': False}, 'exitValuation': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}}, 'additionalProperties': False}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['inputs'], 'properties': {'inputs': {'type': 'object', 'required': ['committedCapital', 'gpCommitPct', 'gpCommitCountedTowardInvested', 'organizationalExpenses', 'operationalExpensesAnnual', 'mgmtFeePct', 'recycledCapitalPct', 'carryPct', 'newInvestmentPeriodYears', 'mgmtFeesPeriodYears', 'portfolio', 'returnTiers'], 'properties': {'carryPct': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'portfolio': {'type': 'object', 'required': ['newPct', 'followPct', 'avgCheckSizeNew', 'avgCheckSizeFollow'], 'properties': {'newPct': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'followPct': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'entryStages': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'numInvestments', 'avgCheckSize'], 'properties': {'name': {'type': 'string'}, 'avgCheckSize': {'type': 'number', 'minimum': 0}, 'reserveRatio': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'pctAllocation': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'followOnChecks': {'type': 'array', 'items': {'type': 'object', 'required': ['avgCheckSize'], 'properties': {'label': {'type': 'string'}, 'avgCheckSize': {'type': 'number', 'minimum': 0}, 'pctOfReserve': {'type': 'number', 'maximum': 1, 'minimum': 0}}, 'additionalProperties': False}}, 'numInvestments': {'type': 'number', 'minimum': 0}, 'initialCheckLabel': {'type': 'string'}}, 'additionalProperties': False}}, 'avgCheckSizeNew': {'type': 'number', 'minimum': 0}, 'avgCheckSizeFollow': {'type': 'number', 'minimum': 0}}, 'additionalProperties': False}, 'mgmtFeePct': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'gpCommitPct': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'returnTiers': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'pctOfCapital', 'multiple', 'holdingPeriodYears'], 'properties': {'name': {'type': 'string', 'minLength': 1}, 'multiple': {'type': 'number', 'minimum': 0}, 'numCompanies': {'type': 'number', 'minimum': 0}, 'pctOfCapital': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'holdingPeriodYears': {'type': 'number', 'minimum': 0}}, 'additionalProperties': False}, 'minItems': 1}, 'tierInputMode': {'enum': ['pct-capital', 'num-companies'], 'type': 'string'}, 'stageInputMode': {'enum': ['pct-capital', 'num-companies'], 'type': 'string'}, 'tierFractional': {'type': 'boolean'}, 'mgmtFeeSchedule': {'type': 'array', 'items': {'type': 'number', 'maximum': 1, 'minimum': 0}}, 'committedCapital': {'type': 'number', 'exclusiveMinimum': 0}, 'recycledCapitalPct': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'fundOperationsYears': {'type': 'number', 'exclusiveMinimum': 0}, 'mgmtFeesPeriodYears': {'type': 'number', 'exclusiveMinimum': 0}, 'organizationalExpenses': {'type': 'number', 'minimum': 0}, 'targetTotalInvestments': {'type': 'number', 'minimum': 0}, 'operationalExpenseLines': {'type': 'array', 'items': {'type': 'object', 'required': ['label', 'amount'], 'properties': {'label': {'type': 'string'}, 'amount': {'type': 'number', 'minimum': 0}}, 'additionalProperties': False}}, 'partnershipExpenseLines': {'type': 'array', 'items': {'type': 'object', 'required': ['label', 'amount'], 'properties': {'label': {'type': 'string'}, 'amount': {'type': 'number', 'minimum': 0}}, 'additionalProperties': False}}, 'newInvestmentPeriodYears': {'type': 'number', 'exclusiveMinimum': 0}, 'operationalExpensesAnnual': {'type': 'number', 'minimum': 0}, 'partnershipExpensesAnnual': {'type': 'number', 'minimum': 0}, 'solveCalledFromDeployment': {'type': 'boolean'}, 'organizationalExpenseLines': {'type': 'array', 'items': {'type': 'object', 'required': ['label', 'amount'], 'properties': {'label': {'type': 'string'}, 'amount': {'type': 'number', 'minimum': 0}}, 'additionalProperties': False}}, 'operationalExpensesBreakout': {'type': 'object', 'required': ['fundAdmin', 'tax', 'audit', 'other'], 'properties': {'tax': {'type': 'number', 'minimum': 0}, 'audit': {'type': 'number', 'minimum': 0}, 'other': {'type': 'number', 'minimum': 0}, 'fundAdmin': {'type': 'number', 'minimum': 0}}, 'additionalProperties': False}, 'gpCommitCountedTowardInvested': {'type': 'boolean'}}, 'additionalProperties': False}, 'idempotency_key': {'type': 'string', 'description': 'Optional retry key; reuse only with identical input.'}}, 'definitions': {'Error': {'type': 'object', 'properties': {'error': {'type': 'object', 'required': ['code', 'message', 'retryable'], 'properties': {'code': {'enum': ['unauthorized', 'payment_required', 'validation_failed', 'engine_error', 'quota_exhausted', 'rate_limited', 'idempotency_conflict', 'service_unavailable', 'method_not_allowed', 'internal_error'], 'type': 'string'}, 'details': {}, 'message': {'type': 'string'}, 'retryable': {'type': 'boolean'}}}}}, 'DailyUsage': {'type': 'object', 'required': ['day', 'product', 'endpoint', 'source', 'succeeded', 'failed'], 'properties': {'day': {'type': 'string', 'format': 'date'}, 'failed': {'type': 'integer'}, 'source': {'type': 'string'}, 'product': {'enum': ['cap-table', 'fund-economics'], 'type': 'string'}, 'endpoint': {'type': 'string'}, 'succeeded': {'type': 'integer'}}}, 'FundResult': {'type': 'object', 'required': ['committedCapital', 'calledCapital', 'managementFees', 'partnershipExpenses', 'investedCapital', 'proceeds', 'distributions', 'grossMultiple', 'netMultiple', 'grossIRR', 'netIRR', 'pic', 'dpi', 'rvpi', 'tvpi', 'weightedHoldPeriodYears'], 'properties': {'dpi': {'type': 'number'}, 'pic': {'type': 'number'}, 'rvpi': {'type': 'number'}, 'tvpi': {'type': 'number'}, 'tiers': {'type': 'array', 'items': {'type': 'object'}}, 'netIRR': {'$ref': '#/definitions/LineTotals'}, 'grossIRR': {'$ref': '#/definitions/LineTotals'}, 'proceeds': {'$ref': '#/definitions/LineTotals'}, 'netMultiple': {'$ref': '#/definitions/LineTotals'}, 'calledCapital': {'$ref': '#/definitions/LineTotals'}, 'distributions': {'$ref': '#/definitions/LineTotals'}, 'grossMultiple': {'$ref': '#/definitions/LineTotals'}, 'managementFees': {'$ref': '#/definitions/LineTotals'}, 'investedCapital': {'$ref': '#/definitions/LineTotals'}, 'committedCapital': {'$ref': '#/definitions/LineTotals'}, 'partnershipExpenses': {'$ref': '#/definitions/LineTotals'}, 'weightedHoldPeriodYears': {'type': 'number'}}}, 'LineTotals': {'type': 'object', 'required': ['total', 'lp', 'gp'], 'properties': {'gp': {'type': 'number'}, 'lp': {'type': 'number'}, 'total': {'type': 'number'}}}, 'UsagePeriod': {'type': 'object', 'required': ['id', 'period_start', 'period_end', 'allowance', 'consumed', 'reserved', 'enabled'], 'properties': {'id': {'type': 'string'}, 'enabled': {'type': 'boolean'}, 'consumed': {'type': 'integer'}, 'reserved': {'type': 'integer'}, 'allowance': {'type': 'integer'}, 'period_end': {'type': 'string', 'format': 'date-time'}, 'period_start': {'type': 'string', 'format': 'date-time'}}}, 'MonthlyUsage': {'type': 'object', 'required': ['month', 'product', 'succeeded', 'failed'], 'properties': {'month': {'type': 'string', 'pattern': '^[0-9]{4}-[0-9]{2}$'}, 'failed': {'type': 'integer'}, 'product': {'enum': ['cap-table', 'fund-economics'], 'type': 'string'}, 'succeeded': {'type': 'integer'}}}, 'ProductAccess': {'type': 'object', 'required': ['product', 'name', 'priceUsd', 'allowance', 'period', 'remaining', 'active'], 'properties': {'name': {'type': 'string'}, 'active': {'type': 'boolean'}, 'period': {'anyOf': [{'type': 'null'}, {'$ref': '#/definitions/UsagePeriod'}]}, 'product': {'enum': ['cap-table', 'fund-economics'], 'type': 'string'}, 'priceUsd': {'type': 'number', 'const': 20}, 'allowance': {'type': 'integer', 'const': 6000}, 'remaining': {'type': 'integer', 'minimum': 0}}}, 'AccessResponse': {'type': 'object', 'properties': {'data': {'type': 'object', 'required': ['products', 'daily'], 'properties': {'daily': {'type': 'array', 'items': {'$ref': '#/definitions/DailyUsage'}}, 'monthly': {'type': 'array', 'items': {'$ref': '#/definitions/MonthlyUsage'}}, 'periods': {'type': 'array', 'items': {'allOf': [{'$ref': '#/definitions/UsagePeriod'}, {'type': 'object', 'required': ['product'], 'properties': {'product': {'enum': ['cap-table', 'fund-economics'], 'type': 'string'}}}]}}, 'products': {'type': 'array', 'items': {'$ref': '#/definitions/ProductAccess'}}}}}}, 'ComputeRequest': {'type': 'object', 'required': ['events'], 'properties': {'events': {'type': 'array', 'items': {'oneOf': [{'$ref': '#/definitions/CommonIssuanceEvent'}, {'$ref': '#/definitions/OptionPoolEvent'}, {'$ref': '#/definitions/SecondarySaleEvent'}, {'$ref': '#/definitions/OptionGrantEvent'}, {'$ref': '#/definitions/ManualIssuanceEvent'}, {'$ref': '#/definitions/ConvertibleRoundEvent'}, {'$ref': '#/definitions/WarrantRoundEvent'}, {'$ref': '#/definitions/PricedRoundEvent'}], 'description': 'One cap-table event, discriminated by `type`. Pass events in chronological order.', 'discriminator': {'mapping': {'option_pool': '#/components/schemas/OptionPoolEvent', 'option_grant': '#/components/schemas/OptionGrantEvent', 'priced_round': '#/components/schemas/PricedRoundEvent', 'warrant_round': '#/components/schemas/WarrantRoundEvent', 'secondary_sale': '#/components/schemas/SecondarySaleEvent', 'common_issuance': '#/components/schemas/CommonIssuanceEvent', 'manual_issuance': '#/components/schemas/ManualIssuanceEvent', 'convertible_round': '#/components/schemas/ConvertibleRoundEvent'}, 'propertyName': 'type'}}, 'maxItems': 200}}, 'additionalProperties': False}, 'ResultResponse': {'type': 'object', 'properties': {'data': {'type': 'object', 'properties': {'result': {'oneOf': [{'$ref': '#/definitions/WaterfallResult'}, {'$ref': '#/definitions/FundResult'}]}}}, 'meta': {'type': 'object', 'properties': {'keyName': {'type': 'string'}}}}}, 'ComputeResponse': {'type': 'object', 'properties': {'data': {'type': 'object', 'properties': {'final': {'$ref': '#/definitions/CapTableSnapshot'}, 'snapshots': {'type': 'array', 'items': {'$ref': '#/definitions/CapTableSnapshot'}, 'description': 'One snapshot per event, in order.'}}}, 'meta': {'type': 'object', 'properties': {'keyName': {'type': 'string'}}}}}, 'OptionPoolEvent': {'type': 'object', 'required': ['type', 'label', 'shares'], 'properties': {'id': {'type': 'string', 'description': 'Pool id, so an option_grant can name which pool it draws from.'}, 'type': {'const': 'option_pool'}, 'label': {'type': 'string'}, 'shares': {'type': 'number'}, 'countMode': {'enum': ['shares', 'percent'], 'description': 'Defaults to "shares".'}, 'targetPct': {'type': 'number', 'description': '0..1 of post-event fully diluted, used when countMode="percent".'}, 'strikePrice': {'type': 'number'}}, 'description': 'Create or expand an option pool (shares authorized, not granted).'}, 'WaterfallResult': {'type': 'object', 'required': ['exitValuation', 'distributable', 'classes', 'series', 'convertibles', 'holders', 'perShare', 'iterations', 'converged'], 'properties': {'series': {'type': 'array', 'items': {'type': 'object'}}, 'classes': {'type': 'array', 'items': {'type': 'object'}}, 'holders': {'type': 'array', 'items': {'type': 'object'}}, 'perShare': {'type': 'array', 'items': {'type': 'object'}}, 'converged': {'type': 'boolean'}, 'iterations': {'type': 'integer'}, 'convertibles': {'type': 'array', 'items': {'type': 'object'}}, 'distributable': {'type': 'number'}, 'exitValuation': {'type': 'number'}}}, 'CapTableSnapshot': {'type': 'object', 'required': ['label', 'holdings', 'totalShares', 'ownership', 'outstandingConvertibles'], 'properties': {'label': {'type': 'string'}, 'holdings': {'type': 'array', 'items': {'type': 'object'}}, 'ownership': {'type': 'array', 'items': {'type': 'object'}}, 'roundDetail': {'type': 'object'}, 'totalShares': {'type': 'number'}, 'pricePerShare': {'type': 'number'}, 'outstandingConvertibles': {'type': 'array', 'items': {'type': 'object'}}}}, 'OptionGrantEvent': {'type': 'object', 'required': ['type', 'label', 'grants'], 'properties': {'type': {'const': 'option_grant'}, 'label': {'type': 'string'}, 'grants': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'shares'], 'properties': {'id': {'type': 'string'}, 'name': {'type': 'string'}, 'shares': {'type': 'number'}}}}, 'poolId': {'type': 'string', 'description': 'Pool id to grant from; omit to draw the common pool.'}}, 'description': 'Grant options to people from one pool (fully-diluted-neutral).'}, 'PricedRoundEvent': {'type': 'object', 'required': ['type', 'label', 'preMoneyValuation', 'investments'], 'properties': {'type': {'const': 'priced_round'}, 'label': {'type': 'string'}, 'pools': {'type': 'array', 'items': {'type': 'object', 'required': ['mode'], 'properties': {'pct': {'type': 'number', 'description': '0..1 of post-money fully diluted, when countMode="percent".'}, 'mode': {'enum': ['pre', 'post'], 'description': '"pre" dilutes existing only; "post" dilutes new money too.'}, 'label': {'type': 'string'}, 'poolId': {'type': 'string', 'description': 'Set to track this pool separately (its own cap-table row).'}, 'shares': {'type': 'number'}, 'countMode': {'enum': ['shares', 'percent'], 'description': 'Defaults to "percent".'}}}, 'description': 'Option pool top-ups for the round (preferred over the legacy targetPoolPct trio).'}, 'poolMode': {'enum': ['pre', 'post', 'custom'], 'description': 'Legacy. Prefer pools[].'}, 'investments': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'amount'], 'properties': {'id': {'type': 'string'}, 'name': {'type': 'string'}, 'amount': {'type': 'number'}, 'proRata': {'type': 'boolean', 'description': 'If true, amount is back-solved to hold pre-round ownership; match by id.'}, 'antiDilution': {'enum': ['weighted-average', 'full-ratchet']}, 'antiDilutionMethod': {'enum': ['conversion-ratio', 'new-shares'], 'description': 'Defaults to "conversion-ratio".'}}}}, 'poolPostPct': {'type': 'number', 'description': 'Legacy. Prefer pools[].'}, 'targetPoolPct': {'type': 'number', 'description': 'Legacy. Prefer pools[].'}, 'preMoneyValuation': {'type': 'number'}}, 'description': 'A priced equity round: new money buys newly issued preferred.'}, 'WarrantRoundEvent': {'type': 'object', 'required': ['type', 'label', 'warrants'], 'properties': {'type': {'const': 'warrant_round'}, 'label': {'type': 'string'}, 'warrants': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'purchaseClass', 'countMode'], 'properties': {'id': {'type': 'string'}, 'name': {'type': 'string'}, 'shares': {'type': 'number', 'description': 'When countMode="shares".'}, 'parValue': {'type': 'number'}, 'countMode': {'enum': ['shares', 'value']}, 'totalValue': {'type': 'number', 'description': 'When countMode="value": shares = totalValue / purchasePrice.'}, 'priceDiscount': {'type': 'number', 'description': '0..1 discount on the source round price.'}, 'purchaseClass': {'enum': ['common', 'preferred']}, 'purchasePrice': {'type': 'number'}, 'purchaseRound': {'type': 'string', 'description': 'For a preferred warrant, the series it targets.'}, 'priceFromRound': {'type': 'string', 'description': 'Source round label to price off, when variable.'}}}}}, 'description': 'Issue warrants (right to buy shares at a set price); counts toward fully diluted now.'}, 'FundComputeRequest': {'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['inputs'], 'properties': {'inputs': {'type': 'object', 'required': ['committedCapital', 'gpCommitPct', 'gpCommitCountedTowardInvested', 'organizationalExpenses', 'operationalExpensesAnnual', 'mgmtFeePct', 'recycledCapitalPct', 'carryPct', 'newInvestmentPeriodYears', 'mgmtFeesPeriodYears', 'portfolio', 'returnTiers'], 'properties': {'carryPct': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'portfolio': {'type': 'object', 'required': ['newPct', 'followPct', 'avgCheckSizeNew', 'avgCheckSizeFollow'], 'properties': {'newPct': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'followPct': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'entryStages': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'numInvestments', 'avgCheckSize'], 'properties': {'name': {'type': 'string'}, 'avgCheckSize': {'type': 'number', 'minimum': 0}, 'reserveRatio': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'pctAllocation': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'followOnChecks': {'type': 'array', 'items': {'type': 'object', 'required': ['avgCheckSize'], 'properties': {'label': {'type': 'string'}, 'avgCheckSize': {'type': 'number', 'minimum': 0}, 'pctOfReserve': {'type': 'number', 'maximum': 1, 'minimum': 0}}, 'additionalProperties': False}}, 'numInvestments': {'type': 'number', 'minimum': 0}, 'initialCheckLabel': {'type': 'string'}}, 'additionalProperties': False}}, 'avgCheckSizeNew': {'type': 'number', 'minimum': 0}, 'avgCheckSizeFollow': {'type': 'number', 'minimum': 0}}, 'additionalProperties': False}, 'mgmtFeePct': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'gpCommitPct': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'returnTiers': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'pctOfCapital', 'multiple', 'holdingPeriodYears'], 'properties': {'name': {'type': 'string', 'minLength': 1}, 'multiple': {'type': 'number', 'minimum': 0}, 'numCompanies': {'type': 'number', 'minimum': 0}, 'pctOfCapital': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'holdingPeriodYears': {'type': 'number', 'minimum': 0}}, 'additionalProperties': False}, 'minItems': 1}, 'tierInputMode': {'enum': ['pct-capital', 'num-companies'], 'type': 'string'}, 'stageInputMode': {'enum': ['pct-capital', 'num-companies'], 'type': 'string'}, 'tierFractional': {'type': 'boolean'}, 'mgmtFeeSchedule': {'type': 'array', 'items': {'type': 'number', 'maximum': 1, 'minimum': 0}}, 'committedCapital': {'type': 'number', 'exclusiveMinimum': 0}, 'recycledCapitalPct': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'fundOperationsYears': {'type': 'number', 'exclusiveMinimum': 0}, 'mgmtFeesPeriodYears': {'type': 'number', 'exclusiveMinimum': 0}, 'organizationalExpenses': {'type': 'number', 'minimum': 0}, 'targetTotalInvestments': {'type': 'number', 'minimum': 0}, 'operationalExpenseLines': {'type': 'array', 'items': {'type': 'object', 'required': ['label', 'amount'], 'properties': {'label': {'type': 'string'}, 'amount': {'type': 'number', 'minimum': 0}}, 'additionalProperties': False}}, 'partnershipExpenseLines': {'type': 'array', 'items': {'type': 'object', 'required': ['label', 'amount'], 'properties': {'label': {'type': 'string'}, 'amount': {'type': 'number', 'minimum': 0}}, 'additionalProperties': False}}, 'newInvestmentPeriodYears': {'type': 'number', 'exclusiveMinimum': 0}, 'operationalExpensesAnnual': {'type': 'number', 'minimum': 0}, 'partnershipExpensesAnnual': {'type': 'number', 'minimum': 0}, 'solveCalledFromDeployment': {'type': 'boolean'}, 'organizationalExpenseLines': {'type': 'array', 'items': {'type': 'object', 'required': ['label', 'amount'], 'properties': {'label': {'type': 'string'}, 'amount': {'type': 'number', 'minimum': 0}}, 'additionalProperties': False}}, 'operationalExpensesBreakout': {'type': 'object', 'required': ['fundAdmin', 'tax', 'audit', 'other'], 'properties': {'tax': {'type': 'number', 'minimum': 0}, 'audit': {'type': 'number', 'minimum': 0}, 'other': {'type': 'number', 'minimum': 0}, 'fundAdmin': {'type': 'number', 'minimum': 0}}, 'additionalProperties': False}, 'gpCommitCountedTowardInvested': {'type': 'boolean'}}, 'additionalProperties': False}}, 'additionalProperties': False}, 'SecondarySaleEvent': {'type': 'object', 'required': ['type', 'label', 'fromId', 'toId', 'toName', 'shares'], 'properties': {'toId': {'type': 'string'}, 'type': {'const': 'secondary_sale'}, 'class': {'enum': ['common', 'preferred', 'option-pool', 'warrant'], 'description': 'Defaults to "common".'}, 'label': {'type': 'string'}, 'round': {'type': 'string', 'description': 'Which series the shares come from (e.g. "Series A").'}, 'fromId': {'type': 'string'}, 'shares': {'type': 'number'}, 'toName': {'type': 'string'}}, 'description': 'Transfer existing shares from one holder to another.'}, 'CommonIssuanceEvent': {'type': 'object', 'required': ['type', 'label', 'grants'], 'properties': {'type': {'const': 'common_issuance'}, 'label': {'type': 'string'}, 'grants': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'kind', 'shares'], 'properties': {'id': {'type': 'string'}, 'kind': {'enum': ['founder', 'employee']}, 'name': {'type': 'string'}, 'shares': {'type': 'number'}}}}}, 'description': 'Issue common stock (founders, employees).'}, 'ManualIssuanceEvent': {'type': 'object', 'required': ['type', 'label', 'issuances'], 'properties': {'type': {'const': 'manual_issuance'}, 'label': {'type': 'string'}, 'issuances': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'kind', 'class', 'shares'], 'properties': {'id': {'type': 'string'}, 'kind': {'enum': ['founder', 'employee', 'investor', 'pool']}, 'name': {'type': 'string'}, 'class': {'enum': ['common', 'preferred', 'option-pool', 'warrant']}, 'shares': {'type': 'number'}, 'pctBasis': {'enum': ['fully-diluted', 'issued'], 'description': 'Defaults to "fully-diluted".'}, 'countMode': {'enum': ['shares', 'percent'], 'description': 'Defaults to "shares".'}, 'targetPct': {'type': 'number', 'description': '0..1, used when countMode="percent".'}, 'issuePrice': {'type': 'number'}}}}}, 'description': 'Escape hatch: issue exact shares for custom arrangements.'}, 'ConvertibleRoundEvent': {'type': 'object', 'required': ['type', 'label', 'convertibles'], 'properties': {'type': {'const': 'convertible_round'}, 'label': {'type': 'string'}, 'convertibles': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'kind', 'principal'], 'properties': {'id': {'type': 'string'}, 'mfn': {'type': 'boolean'}, 'kind': {'enum': ['safe', 'note']}, 'name': {'type': 'string'}, 'capType': {'enum': ['pre-money', 'post-money', 'post-money-fixed', 'post-money-fixed-after']}, 'discount': {'type': 'number', 'description': '0..1.'}, 'principal': {'type': 'number'}, 'dilutionMode': {'enum': ['existing-only', 'all'], 'description': 'Defaults to "existing-only".'}, 'interestRate': {'type': 'number', 'description': 'Annual fraction (0.05 = 5%). Notes only.'}, 'valuationCap': {'type': 'number'}, 'conversionDate': {'type': 'string', 'description': 'ISO date. Notes only.'}, 'investmentDate': {'type': 'string', 'description': 'ISO date. Notes only.'}, 'accruedInterest': {'type': 'number'}}}}}, 'description': 'Issue SAFEs or notes; they convert to preferred at the next priced round.'}, 'WaterfallComputeRequest': {'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['exitValuation', 'model'], 'properties': {'model': {'type': 'object', 'required': ['common', 'preferred'], 'properties': {'debt': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'common': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'shares'], 'properties': {'id': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'name': {'type': 'string', 'maxLength': 200}, 'shares': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'invested': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 500}, 'options': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'shares', 'strike'], 'properties': {'id': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'name': {'type': 'string', 'maxLength': 200}, 'shares': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'strike': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'vestedFraction': {'type': 'number', 'maximum': 1, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 500}, 'warrants': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'shares', 'strike'], 'properties': {'id': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'name': {'type': 'string', 'maxLength': 200}, 'shares': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'strike': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 500}, 'preferred': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'holders', 'seniority'], 'properties': {'id': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'name': {'type': 'string', 'maxLength': 200}, 'holders': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'shares', 'invested'], 'properties': {'id': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'name': {'type': 'string', 'maxLength': 200}, 'shares': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'invested': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 500}, 'multiple': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'seniority': {'type': 'number'}, 'dividendRate': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'dividendStart': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$'}, 'participation': {'enum': ['none', 'full', 'capped'], 'type': 'string'}, 'investmentDate': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$'}, 'conversionRatio': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0, 'exclusiveMinimum': 0}, 'participationCap': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'dividendCumulative': {'type': 'boolean'}}, 'additionalProperties': False}, 'maxItems': 20}, 'convertibles': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'kind', 'principal'], 'properties': {'id': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'cap': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0, 'exclusiveMinimum': 0}, 'kind': {'enum': ['pre-safe', 'post-safe', 'note'], 'type': 'string'}, 'name': {'type': 'string', 'maxLength': 200}, 'discount': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'cashOutAs': {'enum': ['debt', 'equity'], 'type': 'string'}, 'principal': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'seniority': {'type': 'number'}, 'accruedInterest': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'premiumMultiple': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'cashOutSeniority': {'enum': ['senior', 'pari-passu'], 'type': 'string'}}, 'additionalProperties': False}, 'maxItems': 100}, 'unissuedPool': {'type': 'object', 'required': ['shares'], 'properties': {'shares': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}, 'treatment': {'type': 'string', 'const': 'cancel'}}, 'additionalProperties': False}, 'transactionExpenses': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}}, 'additionalProperties': False}, 'exitValuation': {'type': 'number', 'maximum': 1000000000000000, 'minimum': 0}}, 'additionalProperties': False}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'required': ['model'], 'properties': {'model': {'enum': ['cap-table', 'exit-waterfall', 'fund-economics'], 'type': 'string', 'description': 'Model key to check access for.'}}}
Input schema
{'type': 'object', 'properties': {}}
Input schema
{'type': 'object', 'properties': {'to': {'type': 'string', 'description': 'Optional UTC end date (YYYY-MM-DD).'}, 'from': {'type': 'string', 'description': 'Optional UTC start date (YYYY-MM-DD).'}}}
Input schema
{'type': 'object', 'properties': {'topic': {'enum': ['formatting', 'structure', 'inputs', 'assumptions', 'review', 'sharing', 'all'], 'type': 'string', 'description': 'Optional topic filter. Returns all best practices if omitted.'}}}
Input schema
{'type': 'object', 'required': ['template_name'], 'properties': {'template_name': {'enum': ['standard', 'cap_table', 'venture_fund', 'venture_fund_quarterly', 'runway', 'saas', 'ecommerce', 'unit_economics', 'fund_economics', 'fund_economics_tool_web', 'venture_valuation', 'all'], 'type': 'string', 'description': 'The template to get checks for. Use "all" for universal checks only.'}}}
Input schema
{'type': 'object', 'required': ['slug'], 'properties': {'slug': {'type': 'string', 'description': 'The concept slug, from list_concepts (e.g. "waterfall", "anti-dilution").'}}}
Input schema
{'type': 'object', 'properties': {'template_name': {'enum': ['standard', 'cap_table', 'venture_fund', 'venture_fund_quarterly', 'runway', 'saas', 'ecommerce', 'unit_economics', 'fund_economics', 'fund_economics_tool_web', 'venture_valuation'], 'type': 'string', 'description': 'Optional. If provided, appends a template-specific primer to the universal context.'}}}
Input schema
{'type': 'object', 'required': ['template_name'], 'properties': {'task_type': {'type': 'string', 'description': 'Optional task type filter.'}, 'template_name': {'enum': ['standard', 'cap_table', 'venture_fund', 'venture_fund_quarterly', 'runway', 'saas', 'ecommerce', 'unit_economics', 'fund_economics', 'fund_economics_tool_web', 'venture_valuation'], 'type': 'string', 'description': 'The Hemrock template being used.'}}}
Input schema
{'type': 'object', 'properties': {'tag': {'type': 'string', 'description': 'Optional. Filter to concepts whose tags contain this string (e.g. "cap tables").'}, 'template_name': {'enum': ['standard', 'cap_table', 'venture_fund', 'venture_fund_quarterly', 'runway', 'saas', 'ecommerce', 'unit_economics', 'fund_economics', 'fund_economics_tool_web', 'venture_valuation'], 'type': 'string', 'description': 'Optional. Filter to concepts relevant to a specific Hemrock template.'}}}
Input schema
{'type': 'object', 'properties': {}}
Recent tool changes
Similar MCP servers
LuxAlgo MCP
Provides trading and technical-analysis reference content, market edge statistics, prop-firm challenge analysis, and trade-journa…
Canon (wallstreet.wiki)
Searches a finance reference canon, explains regulatory thresholds and formulas, computes validated finance metrics, and produces…
Halal or Not
Provides Islamic-law assessments for food, medicine, financial products, crypto, stocks, funds, and everyday practices across fou…
vorausgedacht.at
Provides precious-metal prices and historical analysis, material-value calculations, educational reference content, public-domain…
archive
Queries a source-traced archive of Lunenburg town and school budgets, meetings, staffing, elections, ledgers, and annual reports.
ITIN Finance
Provides verified information, guides, lender directories, and eligibility answers for US loans, credit, and cards using an ITIN.
FINLY Mortgage Knowledge
Provides sourced Israeli mortgage knowledge and performs limited hypothetical loan, payment, LTV, and PTI calculations.
MyKIFRS
Searches and retrieves Korean accounting standards, audit and ESG standards, and related official accounting Q&A documents.