Bullrun
What this MCP does
Provides global stock and ETF research, screening, financial analysis, risk metrics, portfolio analytics, and draft portfolio creation.
Tools
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['tickers'], 'properties': {'tickers': {'type': 'array', 'items': {'type': 'string', 'minLength': 1}, 'maxItems': 10, 'minItems': 2, 'description': 'Two to ten exact Bullrun ETF listing tickers.'}, 'topSharedLimit': {'type': 'integer', 'default': 20, 'maximum': 100, 'minimum': 1}}, 'additionalProperties': False}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['tickers', 'methodology', 'coverage', 'pairs', 'warnings'], 'properties': {'pairs': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': {}}}, 'tickers': {'type': 'array', 'items': {'type': 'string'}}, 'coverage': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': {}}}, 'warnings': {'type': 'array', 'items': {'type': 'string'}}, 'methodology': {'type': 'object', 'additionalProperties': {}}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['portfolioId', 'candidateTicker'], 'properties': {'days': {'type': 'integer', 'default': 370, 'maximum': 1825, 'minimum': 30}, 'portfolioId': {'type': 'integer', 'description': 'Portfolio id returned by list_portfolios.', 'exclusiveMinimum': 0}, 'candidateTicker': {'type': 'string', 'minLength': 1, 'description': 'Exact Bullrun ETF listing ticker to test.'}, 'candidateWeightPct': {'type': 'number', 'default': 5, 'maximum': 50, 'minimum': 0.1}, 'includeLookThrough': {'type': 'boolean', 'default': True}}, 'additionalProperties': False}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['portfolioId', 'candidateTicker', 'candidateWeightPct', 'priceRiskFit', 'lookThroughFit', 'coverage', 'warnings'], 'properties': {'coverage': {'type': 'object', 'additionalProperties': {}}, 'warnings': {'type': 'array', 'items': {'type': 'string'}}, 'portfolioId': {'type': 'integer'}, 'priceRiskFit': {'anyOf': [{'type': 'object', 'additionalProperties': {}}, {'type': 'null'}]}, 'lookThroughFit': {'anyOf': [{'type': 'object', 'additionalProperties': {}}, {'type': 'null'}]}, 'candidateTicker': {'type': 'string'}, 'candidateWeightPct': {'type': 'number'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['tickers'], 'properties': {'include': {'type': 'array', 'items': {'enum': ['classification', 'market', 'fund_data', 'costs', 'income', 'benchmark', 'performance', 'risk', 'holdings'], 'type': 'string'}, 'default': ['classification', 'market', 'fund_data', 'costs', 'income', 'benchmark'], 'maxItems': 9, 'minItems': 1}, 'tickers': {'type': 'array', 'items': {'type': 'string', 'minLength': 1}, 'maxItems': 10, 'minItems': 2, 'description': 'Two to ten exact Bullrun ETF listing tickers.'}, 'performanceDays': {'type': 'integer', 'default': 370, 'maximum': 1825, 'minimum': 30}}, 'additionalProperties': False}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['tickers', 'requestedModules', 'rows', 'leaders', 'coverage', 'warnings'], 'properties': {'rows': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': {}}}, 'leaders': {'type': 'object', 'additionalProperties': {}}, 'tickers': {'type': 'array', 'items': {'type': 'string'}}, 'coverage': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': {}}}, 'warnings': {'type': 'array', 'items': {'type': 'string'}}, 'requestedModules': {'type': 'array', 'items': {'enum': ['classification', 'market', 'fund_data', 'costs', 'income', 'benchmark', 'performance', 'risk', 'holdings'], 'type': 'string'}}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'prompt': {'type': 'string', 'maxLength': 600, 'description': 'What kind of portfolio to draft, e.g. "a defensive dividend portfolio of large EU stocks". Optional: if you omit it, the server collects a quick style/region/size brief from the user directly (a native form on clients that support elicitation; otherwise it asks you to gather those first).'}, 'maxPositions': {'type': 'integer', 'maximum': 20, 'minimum': 3, 'description': 'Maximum number of holdings (3-20, default 10).'}, 'startingCash': {'type': 'number', 'maximum': 100000000, 'minimum': 100, 'description': 'Starting cash in USD (default 10000).'}, 'instrumentUniverse': {'enum': ['stocks', 'etfs', 'mix'], 'type': 'string', 'description': 'Candidate universe: stocks only, ETFs only, or a mix. Default mix unless the prompt says otherwise.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['positions'], 'properties': {'name': {'type': 'string', 'maxLength': 72, 'description': 'Portfolio name. Default "Custom Portfolio Draft".'}, 'cashPct': {'type': 'number', 'maximum': 95, 'minimum': 0, 'description': 'Explicit cash percentage to hold back. Overrides the weight-remainder rule.'}, 'positions': {'type': 'array', 'items': {'type': 'object', 'required': ['ticker'], 'properties': {'ticker': {'type': 'string', 'description': 'Exact Bullrun ticker, used verbatim (never re-picked), e.g. VWCE.DE, SMH, ROG.SW.'}, 'weight': {'type': 'number', 'description': 'Target weight as a PERCENT (e.g. 46 for 46%). If the weights across positions sum to <=100 the remainder is held as cash; any other sum is normalised to fully invested. Use weight OR amountUsd across the basket, not both.', 'exclusiveMinimum': 0}, 'amountUsd': {'type': 'number', 'description': 'Explicit USD amount to allocate to this holding. If ANY position uses amountUsd, sizing is by amount for all.', 'exclusiveMinimum': 0}}, 'additionalProperties': False}, 'maxItems': 30, 'minItems': 1, 'description': 'The exact holdings to persist (1-30). Tickers are used verbatim, never re-selected.'}, 'startingCash': {'type': 'number', 'maximum': 100000000, 'minimum': 100, 'description': 'Total portfolio cash in USD. Default 10000 in weight mode; the sum of amounts in amount mode.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['portfolioId'], 'properties': {'portfolioId': {'type': 'integer', 'description': 'The Bullrun portfolio id to propose additions for. Use list_portfolios first if unsure.', 'exclusiveMinimum': 0}, 'maxPositions': {'type': 'integer', 'maximum': 5, 'minimum': 1, 'description': 'How many suggested additions to save, 1-5. Use 1 for a single-position idea; default 3.'}, 'instrumentUniverse': {'enum': ['stocks', 'etfs', 'mix'], 'type': 'string', 'description': 'Candidate universe: stocks only, ETFs only, or a mix. Default mix.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['ticker'], 'properties': {'search': {'type': 'string', 'description': 'Optional case-insensitive text/speaker search across transcript chunks.'}, 'ticker': {'type': 'string', 'minLength': 1, 'description': 'The ticker exactly as listed on Bullrun, e.g. "CRWD", "SPGI", "V".'}, 'maxChunks': {'type': 'integer', 'default': 80, 'maximum': 200, 'minimum': 1, 'description': 'Maximum speaker-tagged transcript chunks to return.'}, 'fiscalYear': {'type': 'integer', 'maximum': 2200, 'minimum': 1900, 'description': 'Optional fiscal year filter.'}, 'fiscalQuarter': {'type': 'integer', 'maximum': 4, 'minimum': 1, 'description': 'Optional fiscal quarter filter.'}, 'maxCharsPerChunk': {'type': 'integer', 'default': 1600, 'maximum': 4000, 'minimum': 200, 'description': 'Maximum characters per transcript chunk in the MCP response.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['ticker'], 'properties': {'types': {'type': 'array', 'items': {'enum': ['sector', 'country', 'currency', 'asset', 'factor', 'thematic'], 'type': 'string'}, 'default': ['sector', 'country', 'currency', 'asset'], 'maxItems': 6, 'minItems': 1}, 'ticker': {'type': 'string', 'minLength': 1, 'description': 'Exact Bullrun ETF listing ticker.'}, 'limitPerType': {'type': 'integer', 'default': 25, 'maximum': 100, 'minimum': 1}}, 'additionalProperties': False}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['ticker', 'requestedTypes', 'availableTypes', 'unavailableTypes', 'exposures', 'coverage', 'warnings'], 'properties': {'ticker': {'type': 'string'}, 'coverage': {'type': 'object', 'additionalProperties': {}}, 'warnings': {'type': 'array', 'items': {'type': 'string'}}, 'exposures': {'type': 'object', 'additionalProperties': {}}, 'availableTypes': {'type': 'array', 'items': {'$ref': '#/properties/requestedTypes/items'}}, 'requestedTypes': {'type': 'array', 'items': {'enum': ['sector', 'country', 'currency', 'asset', 'factor', 'thematic'], 'type': 'string'}}, 'unavailableTypes': {'type': 'array', 'items': {'$ref': '#/properties/requestedTypes/items'}}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'limit': {'type': 'integer', 'default': 100, 'maximum': 1000, 'minimum': 1, 'description': 'Maximum values per facet, 1-1000. Each facet reports its untruncated total.'}, 'facets': {'type': 'array', 'items': {'enum': ['assetClasses', 'categories', 'indexKeys', 'productTypes', 'regions', 'domiciles', 'currencies', 'exchanges', 'sectors', 'fundFamilies', 'industries'], 'type': 'string'}, 'minItems': 1, 'description': 'Which facets to return. Defaults to everything except the long tails fundFamilies (~890 issuers) and industries (~650 focus strings) â\x80\x94 request those explicitly, ideally with search.'}, 'search': {'type': 'string', 'description': 'Case-insensitive substring filter applied to every requested facet, e.g. "ishares" against fundFamilies or "world" against categories.'}}, 'additionalProperties': False}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['facets', 'totals', 'truncatedFacets', 'search', 'notes'], 'properties': {'notes': {'type': 'array', 'items': {'type': 'string'}}, 'facets': {'type': 'object', 'additionalProperties': {}}, 'search': {'type': ['string', 'null']}, 'totals': {'type': 'object', 'additionalProperties': {'type': 'number'}}, 'truncatedFacets': {'type': 'array', 'items': {'type': 'string'}}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'isin': {'type': 'string', 'description': 'Fund ISIN, e.g. IE00B4L5Y983. The identifier European factsheets and brokers quote.'}, 'ticker': {'type': 'string', 'description': 'Any venue listing ticker of the fund, e.g. EUNL.DE or IWDA.L. Resolved to its fund ISIN first. Provide this or isin.'}}, 'additionalProperties': False}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['query', 'found', 'fund', 'listings', 'warnings'], 'properties': {'fund': {'anyOf': [{'type': 'object', 'additionalProperties': {}}, {'type': 'null'}]}, 'found': {'type': 'boolean'}, 'query': {'type': 'object', 'additionalProperties': {}}, 'listings': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': {}}}, 'warnings': {'type': 'array', 'items': {'type': 'string'}}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['ticker'], 'properties': {'limit': {'type': 'integer', 'default': 25, 'maximum': 100, 'minimum': 1, 'description': 'Maximum holdings to return on this page, 1-100.'}, 'cursor': {'type': 'string', 'description': 'Opaque nextCursor returned by a previous get_etf_holdings call for the same ticker.'}, 'ticker': {'type': 'string', 'minLength': 1, 'description': 'Exact Bullrun ETF listing ticker, including its exchange suffix when present.'}}, 'additionalProperties': False}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['ticker', 'asOfDate', 'returned', 'totalRowsAvailable', 'nextCursor', 'coverage', 'holdings'], 'properties': {'ticker': {'type': 'string'}, 'asOfDate': {'type': ['string', 'null']}, 'coverage': {'type': 'object', 'additionalProperties': {}}, 'holdings': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': {}}}, 'returned': {'type': 'integer', 'minimum': 0}, 'nextCursor': {'type': ['string', 'null']}, 'totalRowsAvailable': {'type': 'integer', 'minimum': 0}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'limit': {'type': 'integer', 'default': 25, 'maximum': 100, 'minimum': 1, 'description': 'Maximum funds (or index families) to return, 1-100.'}, 'scope': {'enum': ['ucits', 'all'], 'type': 'string', 'default': 'ucits', 'description': 'ucits (default) restricts to domiciles a European retail investor can actually buy. all adds US-domiciled trackers, which look cheaper but are not purchasable by EU retail.'}, 'indexKey': {'type': 'string', 'description': 'Normalized index key, e.g. SP500, MSCI_WORLD, NASDAQ100, MSCI_EM, EURO_STOXX_50, TOPIX, FTSE100. Omit to list every index family that has at least one fund.'}, 'distributionPolicy': {'enum': ['ACCUMULATING', 'DISTRIBUTING'], 'type': 'string', 'description': 'Optionally keep only accumulating or only distributing share classes.'}}, 'additionalProperties': False}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['mode', 'indexKey', 'scope', 'found', 'coverage', 'funds', 'indexFamilies', 'warnings'], 'properties': {'mode': {'enum': ['index_group', 'index_list'], 'type': 'string'}, 'found': {'type': 'boolean'}, 'funds': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': {}}}, 'scope': {'type': 'string'}, 'coverage': {'type': 'object', 'additionalProperties': {}}, 'indexKey': {'type': ['string', 'null']}, 'warnings': {'type': 'array', 'items': {'type': 'string'}}, 'indexFamilies': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': {}}}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['ticker'], 'properties': {'days': {'type': 'integer', 'default': 370, 'maximum': 1825, 'minimum': 30, 'description': 'Calendar-day lookback for daily close-price risk calculations.'}, 'ticker': {'type': 'string', 'minLength': 1, 'description': 'Exact Bullrun ETF listing ticker.'}, 'benchmarkTicker': {'type': 'string', 'minLength': 1, 'description': 'Optional exact priced benchmark/proxy ticker for beta, correlation, tracking error, active return, and information ratio.'}, 'riskFreeRatePct': {'type': 'number', 'default': 0, 'maximum': 30, 'minimum': -10, 'description': 'Annual risk-free rate in percentage points for Sharpe, Sortino, and Calmar ratios.'}}, 'additionalProperties': False}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['ticker', 'lookbackDays', 'methodology', 'coverage', 'risk', 'benchmarkRelative', 'warnings'], 'properties': {'risk': {'type': 'object', 'additionalProperties': {}}, 'ticker': {'type': 'string'}, 'coverage': {'type': 'object', 'additionalProperties': {}}, 'warnings': {'type': 'array', 'items': {'type': 'string'}}, 'methodology': {'type': 'object', 'additionalProperties': {}}, 'lookbackDays': {'type': 'integer'}, 'benchmarkRelative': {'anyOf': [{'type': 'object', 'additionalProperties': {}}, {'type': 'null'}]}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['ticker'], 'properties': {'ticker': {'type': 'string', 'minLength': 1, 'description': 'Exact Bullrun ETF listing ticker, including its exchange suffix when present, e.g. SPY, VWRL.L, or EUNL.DE.'}, 'include': {'type': 'array', 'items': {'enum': ['identity', 'classification', 'market', 'fund_data', 'costs', 'income', 'benchmark'], 'type': 'string'}, 'default': ['identity', 'classification', 'market', 'costs'], 'maxItems': 7, 'minItems': 1, 'description': 'Only these snapshot modules are fetched and returned. Default: identity, classification, market, costs.'}}, 'additionalProperties': False}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['ticker', 'found', 'requestedModules', 'availableModules', 'missingModules', 'modules', 'asOf', 'dataQuality'], 'properties': {'asOf': {'type': 'object', 'additionalProperties': {}}, 'found': {'type': 'boolean'}, 'ticker': {'type': 'string'}, 'modules': {'type': 'object', 'additionalProperties': {}}, 'dataQuality': {'type': 'object', 'additionalProperties': {}}, 'missingModules': {'type': 'array', 'items': {'$ref': '#/properties/requestedModules/items'}}, 'availableModules': {'type': 'array', 'items': {'$ref': '#/properties/requestedModules/items'}}, 'requestedModules': {'type': 'array', 'items': {'enum': ['identity', 'classification', 'market', 'fund_data', 'costs', 'income', 'benchmark'], 'type': 'string'}}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['ticker'], 'properties': {'limit': {'type': 'integer', 'default': 260, 'maximum': 1300, 'minimum': 1, 'description': 'Maximum recent daily source bars to load before date filtering and interval aggregation.'}, 'series': {'type': 'array', 'items': {'enum': ['price', 'price_return', 'nav', 'total_return', 'benchmark', 'premium_discount'], 'type': 'string'}, 'default': ['price'], 'maxItems': 6, 'minItems': 1, 'description': 'Requested series. Unsupported stored series are reported in unavailableSeries rather than synthesized.'}, 'ticker': {'type': 'string', 'minLength': 1, 'description': 'Exact Bullrun ETF listing ticker.'}, 'endDate': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$'}, 'interval': {'enum': ['daily', 'weekly', 'monthly'], 'type': 'string', 'default': 'daily'}, 'startDate': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$'}, 'benchmarkTicker': {'type': 'string', 'minLength': 1, 'description': 'Exact priced ticker to use when benchmark is requested. A benchmark name alone cannot resolve a price series safely.'}}, 'additionalProperties': False}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['ticker', 'requestedSeries', 'availableSeries', 'unavailableSeries', 'interval', 'series', 'metadata', 'warnings'], 'properties': {'series': {'type': 'object', 'additionalProperties': {}}, 'ticker': {'type': 'string'}, 'interval': {'enum': ['daily', 'weekly', 'monthly'], 'type': 'string'}, 'metadata': {'type': 'object', 'additionalProperties': {}}, 'warnings': {'type': 'array', 'items': {'type': 'string'}}, 'availableSeries': {'type': 'array', 'items': {'$ref': '#/properties/requestedSeries/items'}}, 'requestedSeries': {'type': 'array', 'items': {'enum': ['price', 'price_return', 'nav', 'total_return', 'benchmark', 'premium_discount'], 'type': 'string'}}, 'unavailableSeries': {'type': 'array', 'items': {'$ref': '#/properties/requestedSeries/items'}}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['ticker'], 'properties': {'years': {'type': 'integer', 'default': 10, 'maximum': 15, 'minimum': 1, 'description': 'How many fiscal years of history to return, counting backward from the latest fiscal year available.'}, 'ticker': {'type': 'string', 'minLength': 1, 'description': 'The ticker exactly as listed on Bullrun - the native local-exchange symbol, e.g. "AAPL", "BMW" (not "BMW.DE"), "ABBN" (not "ABBN.SW"), "NESN", or a numeric code like "005930". Do not append Yahoo-style country suffixes; if a lookup returns nothing, use screen_stocks to find the exact symbol.'}, 'periodType': {'enum': ['annual', 'quarterly', 'both'], 'type': 'string', 'default': 'both', 'description': 'Return annual rows, quarterly rows, or both. Annual rows use fiscalQuarter=0.'}, 'includeEmptyRows': {'type': 'boolean', 'default': False, 'description': 'Include sparse rows that have no major income statement, balance sheet, cash-flow, or EPS values.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['ticker'], 'properties': {'limit': {'type': 'integer', 'default': 80, 'maximum': 200, 'minimum': 1, 'description': 'Maximum estimate rows to return.'}, 'ticker': {'type': 'string', 'minLength': 1, 'description': 'The ticker exactly as listed on Bullrun, e.g. "AAPL", "CRWD", "SPGI".'}, 'periodType': {'enum': ['annual', 'quarterly', 'both'], 'type': 'string', 'default': 'both', 'description': 'Return annual estimates, quarterly estimates, or both.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['ticker'], 'properties': {'limit': {'type': 'integer', 'default': 120, 'maximum': 300, 'minimum': 1, 'description': 'Maximum KPI rows to return.'}, 'ticker': {'type': 'string', 'minLength': 1, 'description': 'The ticker exactly as listed on Bullrun, e.g. "CRWD", "SNOW", "V".'}, 'category': {'type': 'string', 'description': 'Optional category filter such as SaaS, payments, marketplace, banking, or other domain labels.'}, 'metricKey': {'type': 'string', 'description': 'Optional exact metric key to filter, e.g. ARR, NRR, RPO, BILLINGS, PAYMENT_VOLUME.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['portfolioId'], 'properties': {'days': {'type': 'integer', 'maximum': 1825, 'minimum': 30, 'description': 'Calendar-day lookback for daily USD return analytics. Default 370.'}, 'portfolioId': {'type': 'integer', 'description': 'The portfolio id, as returned by list_portfolios.', 'exclusiveMinimum': 0}, 'privacyMode': {'enum': ['full', 'weights_only'], 'type': 'string', 'description': '"full" (default) includes absolute USD amounts; "weights_only" returns only relative figures.'}, 'candidateTicker': {'type': 'string', 'minLength': 1, 'description': 'Optional exact Bullrun ticker to test as a candidate diversifier - the native local-exchange symbol, e.g. AAPL, BMW, ABBN, NESN (not Yahoo-style suffixes like BMW.DE).'}, 'candidateWeightPct': {'type': 'number', 'maximum': 50, 'minimum': 0, 'description': 'Optional hypothetical candidate allocation for pro-forma volatility. Default 5 (%).'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['portfolioId'], 'properties': {'days': {'type': 'integer', 'maximum': 3700, 'minimum': 7, 'description': 'Insights look-back window in days (default 30).'}, 'portfolioId': {'type': 'integer', 'description': 'The portfolio id, as returned by list_portfolios.', 'exclusiveMinimum': 0}, 'privacyMode': {'enum': ['full', 'weights_only'], 'type': 'string', 'description': '"full" (default) includes absolute $; "weights_only" returns only relative figures.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['ticker'], 'properties': {'years': {'type': 'integer', 'default': 10, 'maximum': 15, 'minimum': 2, 'description': 'How many fiscal years of annual history to evaluate.'}, 'ticker': {'type': 'string', 'minLength': 1, 'description': 'The ticker exactly as listed on Bullrun - the native local-exchange symbol, e.g. "AAPL", "BMW" (not "BMW.DE"), "ABBN" (not "ABBN.SW"), "NESN", or a numeric code like "005930". Do not append Yahoo-style country suffixes; if a lookup returns nothing, use screen_stocks to find the exact symbol.'}, 'estimatedWaccPct': {'type': 'number', 'maximum': 50, 'minimum': 0, 'description': 'Optional user-supplied WACC assumption, in percent. When omitted, ROIC-vs-WACC spread is returned as null.'}, 'taxRateFallbackPct': {'type': 'number', 'default': 21, 'maximum': 50, 'minimum': 0, 'description': 'Fallback tax rate used for NOPAT only when reported tax/pretax data is missing or unusable.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['ticker'], 'properties': {'limit': {'type': 'integer', 'default': 160, 'maximum': 300, 'minimum': 1, 'description': 'Maximum breakdown rows to return.'}, 'ticker': {'type': 'string', 'minLength': 1, 'description': 'The ticker exactly as listed on Bullrun, e.g. "SPGI", "MSFT", "V".'}, 'dimension': {'enum': ['segment', 'geography', 'product', 'customer', 'other', 'all'], 'type': 'string', 'default': 'all', 'description': 'Breakdown dimension to return, or all dimensions.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['ticker'], 'properties': {'ticker': {'type': 'string', 'minLength': 1, 'description': 'The stock ticker exactly as listed on Bullrun - the native local-exchange symbol, e.g. "AAPL", "BMW" (not "BMW.DE"), "ABBN" (not "ABBN.SW"), "NESN", or a numeric code like "005930". Do not append Yahoo-style country suffixes.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'privacyMode': {'enum': ['full', 'weights_only'], 'type': 'string', 'description': '"full" (default) includes absolute $; "weights_only" hides cash/value/cost-basis and keeps only %.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'focus': {'type': 'string', 'description': 'Exact ETF exposure filter, such as Japan, Equity - Australia, TOPIX, or an exchange/source exposure label. Kept as focus for API compatibility.'}, 'limit': {'type': 'integer', 'default': 25, 'maximum': 100, 'minimum': 1, 'description': 'Maximum ETF search rows to return, 1-100.'}, 'search': {'type': 'string', 'description': 'Free-text ETF search by ticker or fund name. Omit to list the first ETFs.'}, 'ticker': {'type': 'string', 'description': 'Exact ETF ticker for profile, prices, and optional holdings, e.g. SPY, VWRL.L, EUNL.DE.'}, 'category': {'type': 'string', 'description': 'Exact broad ETF asset-class filter, such as Equity, Fixed Income, Commodity, Crypto, or Real Estate. Kept as category for API compatibility.'}, 'currency': {'type': 'string', 'description': 'Exact trading currency filter, e.g. USD, EUR, CHF.'}, 'domicile': {'type': 'string', 'description': 'Exact ETF domicile filter.'}, 'exchange': {'type': 'string', 'description': 'Exact exchange filter, e.g. NYSE ARCA, LSE, XETRA.'}, 'priceLimit': {'type': 'integer', 'default': 1, 'maximum': 250, 'minimum': 0, 'description': 'Recent daily price rows to return for an exact ticker. Use 0 to skip prices.'}, 'holdingsLimit': {'type': 'integer', 'default': 25, 'maximum': 100, 'minimum': 1, 'description': 'Maximum holdings to return for an exact ticker, 1-100.'}, 'includeHoldings': {'type': 'boolean', 'default': True, 'description': 'When ticker is supplied, include latest holdings. Ignored for broad searches.'}, 'includeInactive': {'type': 'boolean', 'default': False, 'description': 'Include ETFs with no recent price bar. Default false.'}, 'includeSecondary': {'type': 'boolean', 'default': False, 'description': 'Include secondary/cross-listed ETF tickers. Default false.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'limit': {'type': 'integer', 'default': 25, 'maximum': 100, 'minimum': 1, 'description': 'Maximum ETFs to return, 1-100.'}, 'order': {'enum': ['desc', 'asc'], 'type': 'string', 'default': 'desc', 'description': 'Sort direction. Nulls always sort last regardless of direction.'}, 'rules': {'type': 'array', 'items': {'type': 'object', 'required': ['metric'], 'properties': {'unit': {'enum': ['', 'K', 'M', 'B', 'T'], 'type': 'string', 'default': '', 'description': "Optional money unit for money metrics: '', K, M, B or T."}, 'value': {'type': ['string', 'number'], 'description': 'Threshold. For money metrics combine with unit for K/M/B/T scaling.'}, 'metric': {'enum': ['expenseRatioPct', 'totalAssets', 'yieldTtmPct', 'holdingsCount', 'fundAgeYears', 'inceptionYear', 'nav', 'return1mPct', 'return3mPct', 'return6mPct', 'return1yPct', 'returnYtdPct', 'volatility1yPct', 'avgVolume90d', 'avgTurnover90d', 'top10ConcentrationPct'], 'type': 'string', 'description': 'Numeric metric to filter on.'}, 'groupId': {'type': 'integer', 'default': 1, 'minimum': 1, 'description': 'Rules with the same groupId are ANDed; different groups are ORed.'}, 'operator': {'enum': ['>=', '<=', '>', '<', '=', '..'], 'type': 'string', 'default': '>=', 'description': "Comparison operator. Use '..' for an inclusive between range with valueMax."}, 'valueMax': {'type': ['string', 'number'], 'description': "Upper bound for '..' range rules. Ignored for other operators."}}, 'additionalProperties': False}, 'default': [], 'description': 'Numeric rules. A fund with no value for a ruled metric never matches that rule.'}, 'issuer': {'type': 'string', 'description': 'Substring match on the fund family/issuer, e.g. "iShares", "Amundi", "Vanguard".'}, 'region': {'type': 'string', 'description': 'Exact investment-region string.'}, 'search': {'type': 'string', 'description': 'Free-text match on ticker, fund name or ISIN. Omit to screen the whole universe.'}, 'sortBy': {'enum': ['expenseRatioPct', 'totalAssets', 'yieldTtmPct', 'return1mPct', 'return3mPct', 'return6mPct', 'return1yPct', 'returnYtdPct', 'volatility1yPct', 'avgVolume90d', 'avgTurnover90d', 'top10ConcentrationPct', 'holdingsCount', 'nav', 'ticker', 'name'], 'type': 'string', 'default': 'totalAssets', 'description': 'Sort field applied to the returned rows.'}, 'category': {'type': 'string', 'description': 'Exact category string. Call get_etf_filter_options for the valid values; a wrong guess silently returns zero rows.'}, 'currency': {'type': 'string', 'description': 'Exact trading currency, e.g. EUR, USD, GBX.'}, 'domicile': {'type': 'string', 'description': 'Exact fund domicile, e.g. "Ireland", "Luxembourg", "United States".'}, 'exchange': {'type': 'string', 'description': 'Exact listing exchange, e.g. XETRA, LSE, "NYSE ARCA".'}, 'indexKey': {'type': 'string', 'description': 'Exact tracked-index key, e.g. SP500, MSCI_WORLD, NASDAQ100. Use get_etf_index_group to compare every fund on one index instead.'}, 'strategy': {'type': 'string', 'description': 'Exact strategy classification string.'}, 'assetClass': {'type': 'string', 'description': 'Exact asset-class group: EQUITY, FIXED_INCOME, COMMODITY, REAL_ESTATE, MULTI_ASSET, CASH, CURRENCY, DIGITAL_ASSETS, ALTERNATIVES or OTHER.'}, 'holdingMode': {'enum': ['INCLUDES', 'EXCLUDES'], 'type': 'string', 'default': 'INCLUDES', 'description': 'INCLUDES keeps funds holding the constituent. EXCLUDES keeps only funds with a holdings snapshot that confirms absence â\x80\x94 funds with no snapshot are dropped, never assumed clean.'}, 'productType': {'type': 'string', 'description': 'Exact wrapper type, e.g. UCITS_FUND.'}, 'ucitsStatus': {'enum': ['UCITS', 'NON_UCITS'], 'type': 'string', 'description': 'UCITS restricts to wrappers a European retail investor can actually buy.'}, 'holdingSearch': {'type': 'string', 'description': 'Look-through filter: find funds by a CONSTITUENT ticker or company name, e.g. "NVDA" or "NVIDIA". Only funds with a stored holdings snapshot can match.'}, 'currencyHedged': {'enum': ['HEDGED', 'NOT_LABELLED_HEDGED'], 'type': 'string', 'description': 'HEDGED selects funds labelled currency-hedged. NOT_LABELLED_HEDGED selects funds not so labelled â\x80\x94 absence of a label is not proof a fund is unhedged.'}, 'benchmarkSearch': {'type': 'string', 'description': 'Substring match on the stated benchmark name.'}, 'includeSecondary': {'type': 'boolean', 'default': False, 'description': "Include secondary venue listings of the same fund. Default false â\x80\x94 one row per fund's primary listing."}, 'marketDevelopment': {'type': 'string', 'description': 'Exact market-development classification, e.g. developed vs emerging.'}, 'distributionPolicy': {'enum': ['ACCUMULATING', 'DISTRIBUTING'], 'type': 'string', 'description': 'Accumulating (reinvests income) or distributing (pays it out) â\x80\x94 the usual first cut for a European investor.'}, 'holdingMinWeightPct': {'type': 'number', 'maximum': 100, 'minimum': 0, 'description': 'Minimum constituent weight in percentage points for holdingSearch to count as a match.'}}, 'additionalProperties': False}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['query', 'coverage', 'matchCount', 'returned', 'results', 'warnings'], 'properties': {'query': {'type': 'object', 'additionalProperties': {}}, 'results': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': {}}}, 'coverage': {'type': 'object', 'additionalProperties': {}}, 'returned': {'type': 'integer', 'minimum': 0}, 'warnings': {'type': 'array', 'items': {'type': 'string'}}, 'matchCount': {'type': 'integer', 'minimum': 0}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'mode': {'enum': ['annual', 'quarterly'], 'type': 'string', 'description': 'Deprecated alias for lookbackMode; kept for compatibility.'}, 'limit': {'type': 'integer', 'default': 25, 'maximum': 100, 'minimum': 1, 'description': 'Maximum number of stocks to return (1-100).'}, 'order': {'enum': ['desc', 'asc'], 'type': 'string', 'default': 'desc', 'description': 'Sort direction. Nulls always sort last regardless of direction.'}, 'rules': {'type': 'array', 'items': {'type': 'object', 'required': ['metric'], 'properties': {'unit': {'enum': ['', 'K', 'M', 'B', 'T'], 'type': 'string', 'default': '', 'description': "Optional money unit for money metrics: '', K, M, B or T."}, 'value': {'type': ['string', 'number'], 'description': 'Threshold value. For money metrics, combine with unit for K/M/B/T scaling.'}, 'metric': {'enum': ['revenueGrowthPct', 'netIncomeGrowthPct', 'grossProfitGrowthPct', 'operatingIncomeGrowthPct', 'ebitdaGrowthPct', 'freeCashflowGrowthPct', 'epsGrowthPct', 'operatingCashflowGrowthPct', 'dividendGrowthPct', 'latestRevenue', 'latestNetIncome', 'latestGrossProfit', 'latestOperatingIncome', 'latestEbitda', 'latestDilutedEps', 'latestDividendsPerShare', 'latestFreeCashflow', 'latestOperatingCashflow', 'latestCash', 'latestTotalAssets', 'latestTotalDebt', 'latestStockholdersEquity', 'marketCap', 'peRatio', 'dividendYield'], 'type': 'string', 'description': 'Metric to filter on.'}, 'groupId': {'type': 'integer', 'default': 1, 'minimum': 1, 'description': 'Rules with the same groupId are ANDed; different groups are ORed.'}, 'operator': {'enum': ['>=', '<=', '>', '<', '=', '..'], 'type': 'string', 'default': '>=', 'description': "Comparison operator. Use '..' for an inclusive between range."}, 'valueMax': {'type': ['string', 'number'], 'description': "Upper bound for '..' range rules. Ignored for other operators."}}, 'additionalProperties': False}, 'default': [], 'description': 'Fundamental rules. Same groupId means AND; different groupIds mean OR.'}, 'sector': {'type': 'string', 'description': 'Exact sector name to filter by, e.g. "Technology", "Healthcare". Omit for all sectors.'}, 'sortBy': {'enum': ['revenueGrowthPct', 'netIncomeGrowthPct', 'grossProfitGrowthPct', 'operatingIncomeGrowthPct', 'ebitdaGrowthPct', 'freeCashflowGrowthPct', 'epsGrowthPct', 'operatingCashflowGrowthPct', 'dividendGrowthPct', 'latestRevenue', 'latestNetIncome', 'latestGrossProfit', 'latestOperatingIncome', 'latestEbitda', 'latestDilutedEps', 'latestDividendsPerShare', 'latestFreeCashflow', 'latestOperatingCashflow', 'latestCash', 'latestTotalAssets', 'latestTotalDebt', 'latestStockholdersEquity', 'marketCap', 'peRatio', 'dividendYield', 'revenueGrowth'], 'type': 'string', 'default': 'marketCap', 'description': 'Metric to sort by. revenueGrowth is accepted as an alias for revenueGrowthPct.'}, 'country': {'type': 'string', 'description': 'Exact country name to filter by, e.g. "United States", "Germany". Omit for all countries.'}, 'periods': {'type': 'integer', 'maximum': 40, 'minimum': 1, 'description': 'Deprecated alias for lookback; kept for compatibility.'}, 'industry': {'type': 'string', 'description': 'Exact industry name to filter by, e.g. "Software - Infrastructure". Omit for all industries.'}, 'lookback': {'type': 'integer', 'default': 3, 'maximum': 40, 'minimum': 1, 'description': 'How many reporting periods to evaluate. Growth rules need at least 2 comparable periods.'}, 'countries': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Exact country names to include. Use this for multi-country screens; it overrides country when provided.'}, 'lookbackMode': {'enum': ['annual', 'quarterly'], 'type': 'string', 'default': 'annual', 'description': 'Whether rule evaluation uses annual or quarterly reporting periods.'}, 'minMarketCap': {'type': 'number', 'minimum': 0, 'description': 'Compatibility shortcut: adds marketCap >= this absolute value to every rule group.'}, 'includeInactive': {'type': 'boolean', 'default': False, 'description': 'Include delisted/inactive tickers with no recent price bar. Default false.'}, 'includeSecondary': {'type': 'boolean', 'default': False, 'description': 'Include secondary cross-listings of the same security. Default false (primary listings only).'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'focus': {'type': 'string', 'description': 'Exact ETF focus/exposure filter, e.g. Japan, TOPIX, or Equity - Australia.'}, 'limit': {'type': 'integer', 'default': 25, 'maximum': 100, 'minimum': 1, 'description': 'Maximum matching ETFs to return, 1-100.'}, 'minAum': {'type': 'number', 'minimum': 0, 'description': "Minimum assets under management in the profile's reported currency units."}, 'region': {'type': 'string', 'description': 'Exact portfolio or investment-region filter.'}, 'search': {'type': 'string', 'description': 'Free-text ETF search by ticker, fund name, or ISIN (e.g. IE00B4L5Y983). Omit for a broad screen.'}, 'sortBy': {'enum': ['relevance', 'ticker', 'name', 'aum', 'expense_ratio', 'yield'], 'type': 'string', 'default': 'relevance', 'description': 'Sort field. Relevance preserves Bullrun search ordering.'}, 'category': {'type': 'string', 'description': 'Exact broad ETF category/asset-class filter, e.g. Equity, Fixed Income, Commodity, Crypto, or Real Estate. Call get_etf_filter_options for valid values.'}, 'currency': {'type': 'string', 'description': 'Exact trading-currency filter.'}, 'domicile': {'type': 'string', 'description': 'Exact fund domicile filter.'}, 'exchange': {'type': 'string', 'description': 'Exact listing exchange filter.'}, 'indexKey': {'type': 'string', 'description': 'Exact tracked-index key, e.g. SP500 or MSCI_WORLD. Use get_etf_index_group to rank every fund on one index by cost.'}, 'scanLimit': {'type': 'integer', 'default': 100, 'maximum': 500, 'minimum': 25, 'description': 'Maximum coarse-search candidates to enrich before applying quantitative filters/sorts, 25-500.'}, 'sortDirection': {'enum': ['asc', 'desc'], 'type': 'string', 'default': 'desc'}, 'minYieldTtmPct': {'type': 'number', 'minimum': 0, 'description': 'Minimum trailing yield in percentage points, e.g. 2 means 2%.'}, 'includeInactive': {'type': 'boolean', 'default': False}, 'includeSecondary': {'type': 'boolean', 'default': False}, 'distributionPolicy': {'enum': ['ACCUMULATING', 'DISTRIBUTING'], 'type': 'string', 'description': 'Accumulating (reinvests income) or distributing (pays it out).'}, 'maxExpenseRatioPct': {'type': 'number', 'minimum': 0, 'description': 'Maximum annual expense ratio in percentage points, e.g. 0.25 means 0.25%.'}}, 'additionalProperties': False}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['query', 'coverage', 'matchesInScannedCandidates', 'returned', 'results', 'warnings'], 'properties': {'query': {'type': 'object', 'additionalProperties': {}}, 'results': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': {}}}, 'coverage': {'type': 'object', 'additionalProperties': {}}, 'returned': {'type': 'integer', 'minimum': 0}, 'warnings': {'type': 'array', 'items': {'type': 'string'}}, 'matchesInScannedCandidates': {'type': 'integer', 'minimum': 0}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['ticker'], 'properties': {'years': {'type': 'number', 'default': 10, 'maximum': 50, 'minimum': 0.25}, 'ticker': {'type': 'string', 'minLength': 1, 'description': 'Exact Bullrun ETF listing ticker.'}, 'spreadPct': {'type': 'number', 'default': 0, 'maximum': 20, 'minimum': 0, 'description': 'Assumed full bid/ask spread in percentage points; each purchase pays half the spread.'}, 'expenseRatioPct': {'type': 'number', 'maximum': 20, 'minimum': 0, 'description': 'Optional expense-ratio override in percentage points. Otherwise uses the stored ETF profile value.'}, 'initialInvestment': {'type': 'number', 'default': 10000, 'minimum': 0}, 'commissionPerTrade': {'type': 'number', 'default': 0, 'minimum': 0}, 'contributionAmount': {'type': 'number', 'default': 0, 'minimum': 0}, 'grossAnnualReturnPct': {'type': 'number', 'default': 0, 'maximum': 100, 'minimum': -99, 'description': 'Assumed annual return before ETF and trading costs, in percentage points. Default 0 isolates direct costs.'}, 'contributionFrequency': {'enum': ['none', 'monthly', 'quarterly', 'annual'], 'type': 'string', 'default': 'monthly'}}, 'additionalProperties': False}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['ticker', 'assumptions', 'results', 'costBreakdown', 'warnings'], 'properties': {'ticker': {'type': 'string'}, 'results': {'type': 'object', 'additionalProperties': {}}, 'warnings': {'type': 'array', 'items': {'type': 'string'}}, 'assumptions': {'type': 'object', 'additionalProperties': {}}, 'costBreakdown': {'type': 'object', 'additionalProperties': {}}}, 'additionalProperties': False}
Recent tool changes
Similar MCP servers
AlpineDataWorks Intelligence Server
Provides economic, market, supply-chain, real-estate, energy, consumer, labor, and other scored intelligence indices with histori…
Stratalize Finance
Provides financial, macroeconomic, banking, credit, commodities, M&A, ESG, labor, and regulatory benchmarks for analysis and plan…
Valuein — SEC EDGAR Fundamentals & Smart-Money Data
Provides point-in-time SEC EDGAR fundamentals, filings, ownership signals, financial analysis, valuation models, research reports…
equibles
Provides equity and market research tools covering SEC filings, company financials, portfolios, prices, options, macroeconomic da…
DFX Real Estate Intelligence
Provides US commercial real estate, parcel, debt maturity, bank CRE exposure, private capital, investor, ownership, occupancy, an…
simplefunctions
Provides prediction-market data, thesis analysis, market signals, portfolio tracking, and automated intent-based trading workflow…
EventTrader MCP
Provides prediction-market research and trading capabilities, including real-time event-market data, CLOB execution paths, fund i…
Signal8
Provides SEC filings, dilution data, insider and institutional ownership, and political-trade data.