Alpaca Trading API integration for Model Context Protocol (MCP)
Screen the global Bullrun stock universe with the app rule engine using custom fundamental rules or named presets: profitable value, dividend income, growth and cash flow, cash generators, dividend growth. action=list_presets discloses exact thresholds, units, annual lookback and sorting without any backend request. action=run (default) executes one preset or custom rules; running uses the API's m
A call is made on an account: it counts against an allowance and the publisher sees it, which is why this one asks who you are first.
What it does
The same Bullrun research as the free public connector, with an allowance of your own. Calls are metered per installation by mcprush, so you never share a budget with other users.
Ask it things like:
- Which UCITS ETF tracks the S&P 500 at the lowest ongoing cost, and where does it trade?
- How much do two ETFs overlap once you look through to their holdings?
- Who are this company's suppliers, customers and competitors, and how concentrated is its risk?
- Find European companies with positive earnings and free cash flow, then compare five of them side by side.
- How do inflation, interest rates and government debt compare across countries?
Tools cover company search by name, ticker or ISIN; stock and ETF screens; financial history, quality and valuation context; daily price history with technical indicators; dated company news and corporate calendars; ETF holdings, exposures, costs and overlap; company risk scores and relationships; and global macro indicators. Every result shows its source date, reporting period and native currency, and missing data is reported as unknown. Daily prices are stored closes, not live quotes. Nothing here is investment advice.
Plans: Free includes 700 successful tool calls a month at up to 20 a minute, enough for about a week at 100 calls a day. Research costs $9 a month for 10,000 calls at up to 30 a minute. Failed calls never count, and there is no daily cap.
Safety limit: both plans also have a backend limit of 10,000 data requests per installation per rolling 24 hours. One tool call can use several requests (comparing five stocks with every module uses 30), so very heavy use can pause before the monthly allowance is spent. Access resumes as older requests leave the window.
This listing has research tools only. Personal portfolios and saved shortlists use the separate Bullrun account connection at https://mcp.bull-run.org/account/mcp.
Quickstart
# 1 — sign in once: npx mcprush@latest login
# it asks for a key from mcprush.com/dashboard#access
# 2 — install
npx mcprush@latest add bull-run/bullrun-research-mcp
# 3 — the plan is chosen at checkout, in the browser
# 4 — ask your agent for something these tools do
# screen_stocks, search_stocks, find_stock_peers and 36 more
Windows PowerShell says 'running scripts is disabled on this system'? Run Set-ExecutionPolicy -Scope CurrentUser RemoteSigned once, or type npx.cmd instead of npx (codex.cmd, gemini.cmd, grok.cmd likewise). PowerShell 7 needs neither.
You are on the Free tier: 700 calls a month, and call 701 returns a normal MCP error rather than an invoice.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. Nothing here runs on your machine — this server runs on the publisher’s own infrastructure behind our gateway, and what you install is the connection to it.
Claude Code has its own MCP command, and the key rides on it as a header — the gateway refuses a call that carries none. Claude Code reads MCPRUSH_KEY each time it connects, so the key stays out of its config: export your key from Access in your shell profile (macOS, Linux), or run setx MCPRUSH_KEY <your key> and open a new terminal (Windows). Or let npx mcprush@latest add bull-run/bullrun-research-mcp write the entry with the key for you; --scope user makes it available in every project.
claude mcp add --transport http --scope user bullrun-research-mcp https://mcprush.com/gw/bullrun-research-mcp/mcp --header 'Authorization: Bearer ${MCPRUSH_KEY}'Reconnect, or start a new session, and the tools appear in the model’s tool list.
One config entry pointing at the gateway. The server itself runs on the publisher’s own infrastructure, so nothing from this listing executes on your machine.
39 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
Screen the global Bullrun stock universe with the app rule engine using custom fundamental rules or named presets: profitable value, dividend income, growth and cash flow, cash generators, dividend growth. action=list_presets discloses exact thresholds, units, annual lookback and sorting without any backend request. action=run (default) executes one preset or custom rules; running uses the API's m
| Parameter | Type | Required | Notes |
|---|---|---|---|
| sector | string | no | Exact sector name to filter by, e.g. "Technology", "Healthcare". Omit for all sectors. |
| industry | string | no | Exact industry name to filter by, e.g. "Software - Infrastructure". Omit for all industries. |
| country | string | no | Exact country name to filter by, e.g. "United States", "Germany". Omit for all countries. |
| countries | array | no | Exact country names to include. Use this for multi-country screens; it overrides country when provided. |
| lookbackMode | string | no | Whether rule evaluation uses annual or quarterly reporting periods. |
| lookback | integer | no | How many reporting periods to evaluate. Growth rules need at least 2 comparable periods. |
| mode | string | no | Deprecated alias for lookbackMode; kept for compatibility. |
| periods | integer | no | Deprecated alias for lookback; kept for compatibility. |
| rules | array | no | Fundamental rules. Same groupId means AND; different groupIds mean OR. |
| minMarketCap | number | no | Compatibility shortcut: adds marketCap >= this absolute value to every rule group. |
| includeSecondary | boolean | no | Include secondary cross-listings of the same security. Default false (primary listings only). |
| includeInactive | boolean | no | Include delisted/inactive tickers with no recent price bar. Default false. |
| sortBy | string | no | Metric to sort by. revenueGrowth is accepted as an alias for revenueGrowthPct. |
| order | string | no | Sort direction. Nulls always sort last regardless of direction. |
| limit | integer | no | Maximum number of stocks to return (1-100). |
Resolve a company name, native ticker, ISIN or exchange-qualified symbol to Bullrun listings before calling exact-ticker research tools. Supports exchange/MIC, country, currency and instrument-type filters. Recognized Yahoo suffixes are checked against compatible stored venues; dots in native share-class tickers are preserved. Returns explicit ambiguous candidates and never picks a listing when al
No parameter schema on file.
Discover stock comparison candidates for one exact Bullrun ticker using stored industry or sector classification. Discloses the chosen classification, country preference, deterministic selection order, scan cap and issuer/listing exclusions. Excludes the subject, secondary listings and identifiable duplicate issuers/share classes. Returns compact stored multiples/growth plus ready-to-use compare_s
No parameter schema on file.
Read bounded stored stock OHLCV history, ascending by trade date, as daily, weekly or monthly bars, with close-based price returns/drawdown and optional deterministic SMA, EMA, Wilder RSI and MACD. Useful for price trends, volatility context and technical analysis; use get_stock_metrics for a latest company snapshot. Up to 2600 recent daily source rows; dates filter that bounded window. Provider s
No parameter schema on file.
Get cached company news for one exact Bullrun ticker, newest publication first, with publisher, source URL, publication date and stored-fetch freshness when recorded. Optional since cutoff and limit up to 50; only the newest 50 stored articles are searched. Useful for company headlines and article sources; use get_corporate_calendar for scheduled earnings/dividends and get_earnings_call_transcript
No parameter schema on file.
Look up ETFs by name, ticker or ISIN, with classification, listing, index, distribution-policy, AUM, expense-ratio and yield filters. Best for finding a known fund. For ranking questions ("cheapest", "largest", "best performing", "most liquid") prefer screen_etfs, which evaluates the whole universe: here minAum and minYieldTtmPct are applied only to a bounded profile-enriched candidate scan, so do
| Parameter | Type | Required | Notes |
|---|---|---|---|
| search | string | no | Free-text ETF search by ticker, fund name, or ISIN (e.g. IE00B4L5Y983). Omit for a broad screen. |
| category | string | no | 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. |
| focus | string | no | Exact ETF focus/exposure filter, e.g. Japan, TOPIX, or Equity - Australia. |
| region | string | no | Exact portfolio or investment-region filter. |
| domicile | string | no | Exact fund domicile filter. |
| exchange | string | no | Exact listing exchange filter. |
| currency | string | no | Exact trading-currency filter. |
| indexKey | string | no | Exact tracked-index key, e.g. SP500 or MSCI_WORLD. Use get_etf_index_group to rank every fund on one index by cost. |
| distributionPolicy | string | no | Accumulating (reinvests income) or distributing (pays it out). |
| minAum | number | no | Minimum assets under management in the profile's reported currency units. |
| maxExpenseRatioPct | number | no | Maximum annual expense ratio in percentage points, e.g. 0.25 means 0.25%. |
| minYieldTtmPct | number | no | Minimum trailing yield in percentage points, e.g. 2 means 2%. |
| sortBy | string | no | Sort field. Relevance preserves Bullrun search ordering. |
| sortDirection | string | no | — |
| includeSecondary | boolean | no | — |
| includeInactive | boolean | no | — |
| scanLimit | integer | no | Maximum coarse-search candidates to enrich before applying quantitative filters/sorts, 25-500. |
| limit | integer | no | Maximum matching ETFs to return, 1-100. |
Screen the WHOLE ETF universe by numeric rules and fund attributes in one pass — expense ratio, AUM, yield, trailing returns, volatility, liquidity, top-10 concentration, fund age and holdings count — combined with issuer, index, domicile, UCITS status, distribution policy, currency hedging and constituent look-through (holdingSearch finds funds by what they hold). Prefer this over search_etfs for
| Parameter | Type | Required | Notes |
|---|---|---|---|
| search | string | no | Free-text match on ticker, fund name or ISIN. Omit to screen the whole universe. |
| assetClass | string | no | Exact asset-class group: EQUITY, FIXED_INCOME, COMMODITY, REAL_ESTATE, MULTI_ASSET, CASH, CURRENCY, DIGITAL_ASSETS, ALTERNATIVES or OTHER. |
| category | string | no | Exact category string. Call get_etf_filter_options for the valid values; a wrong guess silently returns zero rows. |
| domicile | string | no | Exact fund domicile, e.g. "Ireland", "Luxembourg", "United States". |
| region | string | no | Exact investment-region string. |
| exchange | string | no | Exact listing exchange, e.g. XETRA, LSE, "NYSE ARCA". |
| currency | string | no | Exact trading currency, e.g. EUR, USD, GBX. |
| indexKey | string | no | Exact tracked-index key, e.g. SP500, MSCI_WORLD, NASDAQ100. Use get_etf_index_group to compare every fund on one index instead. |
| distributionPolicy | string | no | Accumulating (reinvests income) or distributing (pays it out) — the usual first cut for a European investor. |
| productType | string | no | Exact wrapper type, e.g. UCITS_FUND. |
| ucitsStatus | string | no | UCITS restricts to wrappers a European retail investor can actually buy. |
| issuer | string | no | Substring match on the fund family/issuer, e.g. "iShares", "Amundi", "Vanguard". |
| strategy | string | no | Exact strategy classification string. |
| benchmarkSearch | string | no | Substring match on the stated benchmark name. |
| marketDevelopment | string | no | Exact market-development classification, e.g. developed vs emerging. |
| currencyHedged | string | no | HEDGED selects funds labelled currency-hedged. NOT_LABELLED_HEDGED selects funds not so labelled — absence of a label is not proof a fund is unhedged. |
| holdingSearch | string | no | 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. |
| holdingMode | string | no | INCLUDES keeps funds holding the constituent. EXCLUDES keeps only funds with a holdings snapshot that confirms absence — funds with no snapshot are dropped, never assumed clean. |
| holdingMinWeightPct | number | no | Minimum constituent weight in percentage points for holdingSearch to count as a match. |
| rules | array | no | Numeric rules. A fund with no value for a ruled metric never matches that rule. |
Answer "what is the cheapest way to track <index>?". Returns every fund tracking one index ordered cheapest fee first, deduplicated to one row per FUND rather than per venue listing (a five-venue UCITS fund is one choice, not five) with its listingCount and venues. Defaults to UCITS-buyable domiciles. Omit indexKey to list the available index families. Fees are percentage points and the response s
| Parameter | Type | Required | Notes |
|---|---|---|---|
| indexKey | string | no | 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. |
| scope | string | no | 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. |
| distributionPolicy | string | no | Optionally keep only accumulating or only distributing share classes. |
| limit | integer | no | Maximum funds (or index families) to return, 1-100. |
Resolve one FUND rather than one listing. Given an ISIN (or any venue ticker of the fund) it returns the fund's identity, costs, index, distribution policy, wrapper type and every venue it is listed on with exchange and trading currency. Use this when the user quotes an ISIN, asks "which ticker do I buy on my exchange?", or when several tickers may be the same underlying fund. Ratios are percentag
| Parameter | Type | Required | Notes |
|---|---|---|---|
| isin | string | no | Fund ISIN, e.g. IE00B4L5Y983. The identifier European factsheets and brokers quote. |
| ticker | string | no | Any venue listing ticker of the fund, e.g. EUNL.DE or IWDA.L. Resolved to its fund ISIN first. Provide this or isin. |
List the exact values accepted by the categorical filters on search_etfs and screen_etfs — asset classes, categories, index keys, product/wrapper types, regions, domiciles, currencies, exchanges, and (on request) issuers and focus strings. Those filters match exactly, so a guessed string returns zero rows and looks like "no such ETF exists"; call this first whenever a filter value is not already k
| Parameter | Type | Required | Notes |
|---|---|---|---|
| facets | array | no | Which facets to return. Defaults to everything except the long tails fundFamilies (~890 issuers) and industries (~650 focus strings) — request those explicitly, ideally with search. |
| search | string | no | Case-insensitive substring filter applied to every requested facet, e.g. "ishares" against fundFamilies or "world" against categories. |
| limit | integer | no | Maximum values per facet, 1-1000. Each facet reports its untruncated total. |
Fetch a modular snapshot for one exact ETF listing. The include array controls which of identity, classification, market, fund_data (NAV/AUM), costs, income, and benchmark are fetched and returned. Unrequested modules are omitted; requested-but-unavailable modules are named explicitly. Ratios use percentage points. Read-only.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| ticker | string | yes | Exact Bullrun ETF listing ticker, including its exchange suffix when present, e.g. SPY, VWRL.L, or EUNL.DE. |
| include | array | no | Only these snapshot modules are fetched and returned. Default: identity, classification, market, costs. |
Return the latest stored ETF holdings snapshot with opaque cursor pagination. The response reports the provider's stated holdings count, stored row count, covered weight, and whether the stored rows appear complete. Treat isComplete=false or null as partial look-through data. Historical as-of selection will be added when the upstream API exposes it. Read-only.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| ticker | string | yes | Exact Bullrun ETF listing ticker, including its exchange suffix when present. |
| cursor | string | no | Opaque nextCursor returned by a previous get_etf_holdings call for the same ticker. |
| limit | integer | no | Maximum holdings to return on this page, 1-100. |
Fetch ETF price or price-return history at daily, weekly, or monthly intervals. NAV, true total-return, benchmark, and premium/discount series are returned only when their required source data or an explicit benchmark ticker exists; unavailable requested series are named explicitly and never approximated with price returns. Read-only.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| ticker | string | yes | Exact Bullrun ETF listing ticker. |
| series | array | no | Requested series. Unsupported stored series are reported in unavailableSeries rather than synthesized. |
| benchmarkTicker | string | no | Exact priced ticker to use when benchmark is requested. A benchmark name alone cannot resolve a price series safely. |
| interval | string | no | — |
| startDate | string | no | — |
| endDate | string | no | — |
| limit | integer | no | Maximum recent daily source bars to load before date filtering and interval aggregation. |
Calculate sector, country, currency, and broad asset exposure from the latest stored ETF holdings. Sector and country come from the fund provider's own holdings file where it states them (normalized to Bullrun's sector and country names), otherwise from the Bullrun instrument the holding resolves to by ISIN or by symbol with a matching company name. Currency uses the reported holding currency, els
| Parameter | Type | Required | Notes |
|---|---|---|---|
| ticker | string | yes | Exact Bullrun ETF listing ticker. |
| types | array | no | — |
| limitPerType | integer | no | — |
Calculate drawdown, annualized volatility, downside volatility, historical VaR, Sharpe, Sortino and Calmar ratios from stored daily close prices. With benchmarkTicker, also calculates beta, correlation, tracking error, active return and information ratio on aligned dates. Results are price-return risk, not distribution-adjusted total-return risk. Read-only.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| ticker | string | yes | Exact Bullrun ETF listing ticker. |
| days | integer | no | Calendar-day lookback for daily close-price risk calculations. |
| benchmarkTicker | string | no | Optional exact priced benchmark/proxy ticker for beta, correlation, tracking error, active return, and information ratio. |
| riskFreeRatePct | number | no | Annual risk-free rate in percentage points for Sharpe, Sortino, and Calmar ratios. |
Return a normalized side-by-side comparison of two to ten ETFs across selected classification, market, fund-data, cost, income, benchmark, price-performance, price-risk, holdings, and optional overlap modules. Include overlap to measure pairwise shared securities and weighted overlap from latest stored holdings, matched by security identity rather than ticker alone; cash, currency and derivatives
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tickers | array | yes | Two to ten exact Bullrun ETF listing tickers. |
| include | array | no | — |
| performanceDays | integer | no | — |
Simulate expense-ratio, assumed bid/ask spread, commissions, and recurring contributions over a holding period. Compares the same gross-return path with and without costs and reports direct charges plus ending-value drag. Taxes, FX, market impact and brokerage-specific fees are excluded unless represented by the inputs. Read-only.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| ticker | string | yes | Exact Bullrun ETF listing ticker. |
| initialInvestment | number | no | — |
| contributionAmount | number | no | — |
| contributionFrequency | string | no | — |
| years | number | no | — |
| grossAnnualReturnPct | number | no | Assumed annual return before ETF and trading costs, in percentage points. Default 0 isolates direct costs. |
| expenseRatioPct | number | no | Optional expense-ratio override in percentage points. Otherwise uses the stored ETF profile value. |
| spreadPct | number | no | Assumed full bid/ask spread in percentage points; each purchase pays half the spread. |
| commissionPerTrade | number | no | — |
Fetch a consolidated metrics snapshot for a single stock by ticker: identity (company, exchange, currency, sector, industry, country, ISIN), latest daily price (OHLCV), latest valuation (market cap, P/E, dividend yield, annual dividend per share), the most recent reported financials (revenue, gross/operating income, EBITDA, net income, diluted EPS, free & operating cash flow, total debt, cash, tot
| Parameter | Type | Required | Notes |
|---|---|---|---|
| ticker | string | yes | 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 Yaho |
Compare two to five stock tickers in one compact structured response: annual fundamentals and growth, quality ratios, stored valuation and Bullrun model context, and measured risk dials. Reports each fiscal year, source date, native quote/reporting currency and missing coverage. No currency conversion, quarterly-to-annual substitution, buy/sell ranking or generated research. Read-only.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tickers | array | yes | Two to five distinct exact Bullrun stock listing tickers, e.g. AAPL, BMW, NESN or 005930. No fuzzy company names or inferred ticker suffixes. |
| include | array | no | Selected compact modules. Fundamentals and quality use the latest usable ANNUAL fiscal year only; valuation includes stored multiples and Bullrun model context; risk includes measured dials. |
Fetch 1-15 years of historical financial statements for one exact Bullrun ticker. Returns annual and/or quarterly rows grouped into income statement, balance sheet, cash flow, per-share metrics, margins, source currency, and annual growth/CAGR consistency checks. Use this when evaluating multi-year revenue/net-income growth, margin trajectories, leverage, cash flow quality, or whether a stock pass
| Parameter | Type | Required | Notes |
|---|---|---|---|
| ticker | string | yes | 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-styl |
| periodType | string | no | Return annual rows, quarterly rows, or both. Annual rows use fiscalQuarter=0. |
| years | integer | no | How many fiscal years of history to return, counting backward from the latest fiscal year available. |
| includeEmptyRows | boolean | no | Include sparse rows that have no major income statement, balance sheet, cash-flow, or EPS values. |
Compute annual quality, moat, earnings-quality, and capital-allocation metrics for one exact Bullrun ticker from existing financial statements: ROIC, ROE/ROA, ROIC-vs-supplied-WACC, accruals, cash conversion, capex intensity, dividend payout/growth, diluted share-count changes, and a buyback proxy. Read-only.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| ticker | string | yes | 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-styl |
| years | integer | no | How many fiscal years of annual history to evaluate. |
| estimatedWaccPct | number | no | Optional user-supplied WACC assumption, in percent. When omitted, ROIC-vs-WACC spread is returned as null. |
| taxRateFallbackPct | number | no | Fallback tax rate used for NOPAT only when reported tax/pretax data is missing or unusable. |
Read cached Yahoo analyst consensus revenue/EPS estimates and available EPS revision percentages for one exact Bullrun ticker. A free background refresh checks supported symbols on demand, storing at most one snapshot per day; the first read may be empty. Fiscal periods and source currency are preserved. The configured feed does not provide EBITDA estimates, management guidance or revenue revision
| Parameter | Type | Required | Notes |
|---|---|---|---|
| ticker | string | yes | The ticker exactly as listed on Bullrun, e.g. "AAPL", "CRWD", "SPGI". |
| periodType | string | no | Return annual estimates, quarterly estimates, or both. |
| limit | integer | no | Maximum estimate rows to return. |
Read curated, source-linked operating KPI observations for one exact Bullrun ticker. Coverage is sparse and no automatic KPI feed is configured: do not assume ARR, retention, customer counts or payments metrics are available. Check get_company_data_coverage first. Returns stored fiscal periods, units and source links; company-economics observations are a separate dataset. Read-only.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| ticker | string | yes | The ticker exactly as listed on Bullrun, e.g. "CRWD", "SNOW", "V". |
| metricKey | string | no | Optional exact metric key to filter, e.g. ARR, NRR, RPO, BILLINGS, PAYMENT_VOLUME. |
| category | string | no | Optional category filter such as SaaS, payments, marketplace, banking, or other domain labels. |
| limit | integer | no | Maximum KPI rows to return. |
Fetch segment, geography, product, customer, or other revenue breakdown rows for one exact Bullrun ticker. Use this to separate cyclical businesses from recurring segments or inspect geographic exposure instead of relying on blended revenue. Read-only.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| ticker | string | yes | The ticker exactly as listed on Bullrun, e.g. "SPGI", "MSFT", "V". |
| dimension | string | no | Breakdown dimension to return, or all dimensions. |
| limit | integer | no | Maximum breakdown rows to return. |
Read cached earnings-call paragraphs for one exact Bullrun ticker, optionally filtered by fiscal period or search text. A best-effort free background import collects at most the two latest retained calls from DefeatBeta for supported US listings, with a 24-hour stored-data cooldown; the first read may be empty. Coverage and source publication lag vary. Speaker names and paragraph order are retaine
| Parameter | Type | Required | Notes |
|---|---|---|---|
| ticker | string | yes | The ticker exactly as listed on Bullrun, e.g. "CRWD", "SPGI", "V". |
| fiscalYear | integer | no | Optional fiscal year filter. |
| fiscalQuarter | integer | no | Optional fiscal quarter filter. |
| search | string | no | Optional case-insensitive text/speaker search across transcript chunks. |
| maxChunks | integer | no | Maximum speaker-tagged transcript chunks to return. |
| maxCharsPerChunk | integer | no | Maximum characters per transcript chunk in the MCP response. |
Bullrun's company risk read for one stock: a 0-100 composite risk score and six mechanism dials (market expectation, operating pressure, cash conversion, leverage & coverage, competitive position, concentration) with band (Contained/Normal/Elevated/Stretched/Acute), direction vs the prior reading, the driving input and a plain-English explanation; plus filing-derived risk factors (severity, mechan
| Parameter | Type | Required | Notes |
|---|---|---|---|
| ticker | string | yes | Exact Bullrun ticker, native local-exchange symbol (e.g. "AAPL", "ASML", "NESN", "005930"); no Yahoo-style suffixes. |
| include | array | no | Modules to return. dials = composite + six mechanism dials (market expectation, operating pressure, cash conversion, leverage, competitive position, concentration); risk_factors = filing-derived risk |
| detail | string | no | summary = scores, bands, drivers and explanations; full = also every per-input term behind each category score. |
| maxRiskFactors | integer | no | Max filing risk factors to return, most severe first. |
| maxEvents | integer | no | Max recent company events to return, most severe first. |
Bullrun's company relationship graph for one stock: named competitors, suppliers, customers and partners, each with its Bullrun ticker when the counterparty is listed, verification status (VERIFIED against a primary filing/source vs search-SUGGESTED), confidence, sole-source flag, quantified dependence where disclosed (e.g. "Cirrus Logic gets 91% of revenue from Apple") and the evidence behind it.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| ticker | string | yes | Exact Bullrun ticker, native local-exchange symbol (e.g. "AAPL", "SAP", "ASML"); no Yahoo-style suffixes. |
| roles | array | no | Which relationships to return, from this company's point of view. Default: all four. |
| verifiedOnly | boolean | no | true = only edges confirmed against a primary source (filing, company release). false also returns search-suggested edges, each labelled with its status and confidence. |
| evidence | string | no | none = counts only; sources = source title/URL/type per edge; excerpts = also the quoted evidence text. |
| limitPerRole | integer | no | Max counterparties per role, verified and highest-confidence first. |
Compare the cached company relationship graphs of two to five stock tickers. Finds shared suppliers, customers, competitors and partners, including cross-role overlaps, using stable company entity IDs or exact tickers only. Returns directed direct relationships with VERIFIED vs SUGGESTED/NEEDS_REVIEW status, confidence, sole-source flags, disclosed metrics with meaning/unit/period, and primary-sou
No parameter schema on file.
Read stored upcoming earnings and ex-dividend dates, plus recent equity listings. Supports ticker/company search and explicit effective windows, market-cap filters, native listing quote currencies, available source metadata and partial coverage. Recent first-trade dates are not confirmed IPOs or an upcoming IPO schedule. Calendar dates and estimates can change; missing events mean unknown coverage
No parameter schema on file.
Stored historical company risk category readings and their observed input changes. Shows dates, computation times, formula versions, score changes, changing input coverage and measurement bases. Use for 'how has X's risk changed?' and 'which inputs changed?'. These are retained category scores, not a complete daily series or proof of causation. Missing history is unknown, never a zero risk score.
No parameter schema on file.
A cheap stored-data manifest for one exact company: available datasets, latest reporting periods, actual ingestion/computation timestamps where stored, and cached relationship graph status. Call before deeper research when coverage or freshness is uncertain. This reads indexed metadata, not every research endpoint, and never starts enrichment. Availability is not completeness or accuracy. A null s
No parameter schema on file.
Rank Bullrun's scored stock universe (~9,000 companies) by company risk: the composite risk score or any one mechanism dial (market expectation, operating pressure, cash conversion, leverage, competitive position, concentration), filtered by band, sector, country and dial coverage. Returns ticker, score, band and its meaning, direction and move since the prior reading, and the driving input per ro
| Parameter | Type | Required | Notes |
|---|---|---|---|
| mechanism | string | no | Rank by the composite (OVERALL) or by one mechanism dial: MARKET (drawdown, volatility, liquidity), OPERATING (margin/cost pressure), CASH_CONVERSION (cash vs earnings, capex), LEVERAGE (debt, interes |
| bands | array | no | Keep only these bands, e.g. ["STRETCHED","ACUTE"] for the most strained readings or ["CONTAINED"] for the calmest. |
| sector | string | no | Exact sector, case-insensitive (e.g. "Technology", "Industrials"). Set includeSlices=true to list the sectors the board covers. |
| country | string | no | Exact country, case-insensitive (e.g. "United States", "Germany"). |
| minDialsLit | integer | no | Coverage floor: only companies with at least this many of the six dials measured. 4+ avoids thinly-measured composites. |
| sortBy | string | no | market_cap = largest companies first (default; a pure score sort surfaces micro-caps); score_desc = most strained first; score_asc = calmest first; worsened / improved = biggest move since the prior r |
| limit | integer | no | — |
| offset | integer | no | — |
| includeSlices | boolean | no | Also return mean composite risk by sector and by country across the scored universe. |
Companies whose Bullrun composite risk score crossed into a different band (e.g. Elevated -> Stretched, or Acute -> Stretched) within the last N days, with prior and current score, the move in points, and the input driving the reading. Use for "what got riskier this week", "any risk deteriorations I should know about", or to monitor a watchlist (pass the tickers to get_company_risk afterwards). Ba
| Parameter | Type | Required | Notes |
|---|---|---|---|
| days | integer | no | Look-back window in days for band changes. |
| direction | string | no | Keep only companies whose composite got worse, got better, or both. |
| limit | integer | no | — |
| stableBasisOnly | boolean | no | true (default) = only real movements. false also includes band changes caused purely by a category starting or stopping scoring (coverage changes, flagged basisChanged). |
Bullrun's Global Markets dashboard in one call: world equity indices (S&P 500, Nasdaq-100, MSCI World, DAX, FTSE 100, Nikkei, Hang Seng, Nifty...), central-bank policy rates and next rate decisions (Fed, ECB, BoE, BoJ, SNB, BoC), 16 sovereign 10-year yields, 20 FX pairs, oil/gas/gold/copper, headline macro tiles (global GDP growth, inflation, debt/GDP, VIX, DXY, 2s10s curve, US jobless claims), th
| Parameter | Type | Required | Notes |
|---|---|---|---|
| sections | array | no | Sections to return. headline = global GDP/inflation/debt, oil, gold, DXY, US 10Y, 2s10s curve, VIX, EUR/USD, Bitcoin, policy-rate average, OECD unemployment, US jobless claims; indices = 19 world equi |
| newsLimit | integer | no | Headlines to return when the news section is requested. |
One country's macro dashboard from Bullrun's Global Markets warehouse: a 0-100 macro stress score (higher = more stress) built from six pillars - labour (unemployment, its change, youth unemployment), housing (real house prices, price-to-income and price-to-rent vs history), credit (BIS credit-to-GDP gap, household debt service, household credit), fiscal (government debt, fiscal balance), external
| Parameter | Type | Required | Notes |
|---|---|---|---|
| country | string | yes | Country name, e.g. "Germany", "United States" (aliases like US, UK, Korea, Eurozone are understood). Also "Euro Area". |
Cross-country macro comparison from Bullrun's Global Markets warehouse: rank up to ~200 countries on one indicator (GDP growth annual or quarterly, CPI inflation, government debt/GDP, unemployment, youth unemployment, real house-price growth, house price-to-income and price-to-rent vs history, BIS credit-to-GDP gap, household debt service, household credit/GDP, business and consumer confidence, or
| Parameter | Type | Required | Notes |
|---|---|---|---|
| indicator | string | yes | Which cross-country indicator: gdp_growth (annual), gdp_growth_quarterly, inflation, government_debt, unemployment, youth_unemployment, real_house_prices, house_price_to_income, house_price_to_rent, c |
| countries | array | no | Only these countries (e.g. ["Germany","France","Italy"]); aliases like US/UK understood. Omit for every covered country. |
| order | string | no | desc = highest value first, asc = lowest first. |
| limit | integer | no | — |
Historical time series behind the Global Markets dashboard, often decades long: equity indices, central-bank policy rates, 10-year government bond yields, FX rates, oil/gas/gold/copper, VIX, DXY, the US 2s10s curve, and per-country macro indicators (GDP growth, inflation, unemployment, house prices, credit gap, debt, confidence, macro stress). Address a series by historyCode (from get_global_marke
| Parameter | Type | Required | Notes |
|---|---|---|---|
| code | string | no | Exact series code from another tool's historyCode field (e.g. "CNBC_US10Y", "BIS_CBPOL_US", "UNEMPLOYMENT:Germany", "YAHOO_GSPC"). |
| instrument | string | no | Or a market name: an index ("S&P 500", "DAX", "Nikkei 225"), commodity ("Brent", "Gold"), FX pair ("EUR/USD"), central bank ("Fed", "ECB", "BoE"), 10Y yield ("Germany 10Y", "US 10Y"), or headline seri |
| indicator | string | no | Or a per-country macro indicator, together with country (same keys as get_macro_indicators). |
| country | string | no | Country for indicator, e.g. "Japan". |
| from | string | no | Start date YYYY-MM-DD (inclusive). |
| to | string | no | End date YYYY-MM-DD (inclusive). |
| interval | string | no | Resample to end-of-period values. auto = the finest interval that fits maxPoints. |
| maxPoints | integer | no | Upper bound on returned points (auto interval only; an explicit interval is truncated to the most recent maxPoints). |
Bullrun's proprietary machine-learning valuation and forecast scores for 1-10 stocks, recomputed nightly. Valuation: a LightGBM model predicts the P/E (or price/sales for loss-makers) that companies with similar fundamentals typically command a year out; the gap = typical / current multiple - 1 (positive = trades below its typical multiple), with the implied model-typical P/E, percentile and rank
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tickers | array | yes | 1-10 exact Bullrun tickers (native local-exchange symbols, e.g. ["AAPL","MSFT"] or ["ASML","SAP","NESN"]). |
Rank the whole scored stock universe (market cap >= $100M) by Bullrun's proprietary ML models: the stocks trading furthest below (or above) the P/E or price/sales multiple their fundamentals typically command, or the strongest/weakest relative 1-year forecast signals. Filter by sector, country, exchange and financial-history coverage. Each row has the valuation gap or forecast edge, the model-typi
| Parameter | Type | Required | Notes |
|---|---|---|---|
| model | string | no | valuation = P/E gap on quarterly financials (profitable companies); valuation_ps = price/sales gap (covers loss-makers); valuation_annual_1y = P/E gap on annual financials (broader non-US coverage); f |
| end | string | no | top = highest percentile first (valuation: furthest BELOW typical multiple, i.e. cheapest vs fundamentals; forecast: strongest signal). bottom = lowest first (richest vs fundamentals / weakest signal) |
| coverage | string | no | full = only stocks whose model window (8 quarters / 4 years) is fully populated; limited = the rest. |
| sector | string | no | Exact sector, case-insensitive, e.g. "Technology", "Healthcare", "Financial Services". |
| country | string | no | Exact country, case-insensitive, e.g. "United States", "Germany", "Japan". |
| exchange | string | no | Exact exchange code, case-insensitive, e.g. "NASDAQ", "XETRA", "LSE". |
| limit | integer | no | — |
- 700 calls a month, included
- 20 calls a minute at peak
- Every tool the listing has
- No card needed — call 701 returns a limit error rather than a bill
- Upgrade at any point, prorated to the day
- 10,000 calls a month, included
- 30 calls a minute at peak
- Every tool the listing has
- Cancel any time — the unused days are credited
- Runs behind the gateway, so cancelling stops it
What counts against the 700 calls a month on Free
| Tool | Unit | Calls used | Out of the monthly allowance |
|---|---|---|---|
| screen_stocks | call | 1 | 0.1429% |
| search_stocks | call | 1 | 0.1429% |
| find_stock_peers | call | 1 | 0.1429% |
| get_stock_price_history | call | 1 | 0.1429% |
| get_company_news | call | 1 | 0.1429% |
| search_etfs | call | 1 | 0.1429% |
| screen_etfs | call | 1 | 0.1429% |
| get_etf_index_group | call | 1 | 0.1429% |
Failed calls, timeouts and anything the gateway rejects never count. When the allowance runs out the gateway returns an error naming the plan limit — nothing is billed beyond the subscription, ever.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
| Term | Level | What it prices | Points |
|---|---|---|---|
| capability-exposure | minimal | capability blast radius (minimal) — client exposure if the model is manipulated | −0 |
| coverage-honesty | manifest | inspection depth (manifest) — how much of the target the scan could see | −4 |
What the scan could actually read
A grade is only as meaningful as its coverage, so the scanner publishes its own depth before it publishes its result.
The scan read each tool’s name, description, input schema and annotations exactly as the server listed them the last time it answered us; no code was reviewed. We ask the server again about once a month, and a list that changed is graded again.
The implementation source was not read — this reflects the declared tool metadata only.
Capability — what it could do if the model were manipulated
Tags derived from each tool’s schema and the implementation, not from what the tool calls itself. minimal is the level these add up to.
| Tool | Capability tags | Why the tag was assigned |
|---|---|---|
| screen_stocks | no tags | |
| search_stocks | no tags | |
| find_stock_peers | no tags | |
| get_stock_price_history | no tags | |
| get_company_news | untrusted-input | untrusted-input: keyword "fetch", declares openWorldHint: true (interacts with entities outside the server) |
| search_etfs | no tags | |
| screen_etfs | no tags | |
| get_etf_index_group | no tags | |
| get_etf_fund | no tags | |
| get_etf_filter_options | no tags | |
| get_etf_snapshot | untrusted-input | untrusted-input: keyword "fetch" |
| get_etf_holdings | no tags | |
| get_etf_timeseries | untrusted-input | untrusted-input: keyword "fetch" |
| get_etf_exposures | no tags | |
| get_etf_risk | no tags | |
| compare_etfs | no tags | |
| simulate_etf_cost | no tags | |
| get_stock_metrics | untrusted-input | untrusted-input: keyword "fetch" |
| compare_stocks | no tags | |
| get_financial_history | untrusted-input | untrusted-input: keyword "fetch" |
| get_quality_moat_metrics | no tags | |
| get_forward_estimates | no tags | |
| get_operating_kpis | no tags | |
| get_revenue_breakdown | untrusted-input | untrusted-input: keyword "fetch" |
| get_earnings_call_transcript | no tags | |
| get_company_risk | no tags | |
| get_company_relationships | no tags | |
| compare_company_exposures | no tags | |
| get_corporate_calendar | no tags | |
| get_company_risk_history | no tags | |
| get_company_data_coverage | no tags | |
| screen_risk_board | no tags | |
| get_risk_movers | no tags | |
| get_global_markets_overview | no tags | |
| get_country_macro | no tags | |
| get_macro_indicators | no tags | |
| get_macro_history | no tags | |
| get_valuation_model | no tags | |
| screen_valuation_model | no tags |
Toxic-flow graph
The lethal trifecta, checked as a graph rather than as a checklist: untrusted input, a sensitive source and an external sink have to meet before there is a path worth worrying about.
The public result for this release does not print the flow graph, so there is nothing to show here. That is not the same as "no paths were found": what the scan did read is above, under coverage.
Supply chain and provenance
This is the first scan of this surface here, so there is nothing yet to compare it against.
Every result on this tab comes from one deterministic pass over the published package — offline, rule by rule, and auditable line by line above. Same methodology version, same bytes, same score.
Release history
The gateway serves every install the publisher’s current release, so a release cannot be pinned or rolled back to here yet. The history below is for reading; the current release on file is 0.8.0.
- Fewer, broader tools: stock presets now run through screen_stocks, ETF overlap through compare_etfs, and ETF queries through the focused ETF tools (39 research tools).
- Adds company, ticker and ISIN search; transparent stock-screen presets; classification-based peer discovery; stored price history and technical indicators; sourced company news; corporate calendars; shared company exposures; retained risk history; and dataset coverage and freshness. All added tools provide read-only research. Availability and freshness vary by company and dataset.
- The version this listing went live with, after review.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish Bullrun Research: Stock & UCITS ETF Data, Own Quota can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.