Skip to main content
Glama
ferinator

BullRun

by ferinator

Bullrun MCP

글로벌 주식, ETF 및 개인 포트폴리오에 대한 리서치 분석가로 Claude(및 기타 MCP 클라이언트)를 전환해주는 호스팅형 원격 MCP 서버입니다.

엔드포인트

https://mcp.bull-run.org/mcp — Streamable HTTP, OAuth 2.1 + PKCE

웹 앱

https://bull-run.org

공식 MCP 레지스트리

org.bull-run/bullrun

Glama 커넥터

https://glama.ai/mcp/connectors/org.bull-run/bullrun

개인정보 처리방침

https://bull-run.org/privacy

Bullrun은 주로 호스팅 서비스입니다 — 일반 사용을 위해 설치할 필요도 없고 API 키를 관리할 필요도 없습니다. MCP 클라이언트를 원격 엔드포인트에 연결하고 Google로 로그인하기만 하면 됩니다. 이 저장소는 커넥터의 공개 메타데이터(server.json), 연결 문서, 그리고 디렉토리/보안 검사를 위한 MCP 레이어의 로컬 stdio 빌드를 보관합니다. Bullrun 애플리케이션 및 데이터 서비스는 별도로 유지 관리됩니다.

연결

Claude (웹, Desktop, 모바일) — 유료 Claude 플랜 필요:

  1. 설정 → 커넥터 → 사용자 정의 커넥터 추가

  2. 이름을 Bullrun으로 지정하고 https://mcp.bull-run.org/mcp를 붙여넣은 후 추가합니다.

  3. 연결을 클릭하고 Google 로그인/인증 단계를 완료합니다.

Claude Code:

claude mcp add --transport http bullrun https://mcp.bull-run.org/mcp

Cursor, VS Code 및 MCP Inspector에 대한 전체 설정은 docs/mcp-connect.md에 있습니다.

Related MCP server: Yahoo Finance MCP Server

연결 후 할 수 있는 작업

공개 시장 데이터 도구는 연결된 모든 클라이언트에서 작동합니다. 포트폴리오 도구는 Google 로그인 후 사용자의 Bullrun 계정을 확인합니다. 두 개의 초안 도구는 Bullrun Pro 계정이 필요합니다.

주식

도구

기능

screen_stocks

섹터/산업/국가/시가총액별로 글로벌 유니버스를 스크리닝하고, PER, 배당수익률, 매출 또는 매출 성장률로 정렬합니다.

get_stock_metrics

하나의 티커에 대한 통합 스냅샷 — 식별 정보(ISIN/LEI/CIK), 최신 가격, 밸류에이션, 최근 재무제표, 설명.

get_financial_history

1~15개 회계연도의 연간/분기별 재무제표, 주당 지표, 마진, CAGR 및 일관성 검사.

get_quality_moat_metrics

ROIC, ROIC 대비 WACC 스프레드, ROE/ROA, 발생액, 현금 전환율, 자본적 집약도, 배당 지급/성장률, 자사주 매입 프록시.

get_forward_estimates

컨센서스 매출/EPS/EBITDA, 가이던스, 실적 추정치 수정, 파생된 선행 PER 및 PEG 컨텍스트.

get_operating_kpis

도메인 KPI — ARR, 순매출 유지율, RPO, 청구액, 고객 수, 결제 및 국경 간 거래량.

get_revenue_breakdown

부문, 지역, 제품 또는 고객별 매출 분할.

get_earnings_call_transcript

발언자 태그가 포함된 실적 발표 회의록 청크, 회계 기간 필터 및 텍스트 검색.

ETF 및 펀드

유럽 투자자들이 실제로 펀드를 검색하는 방식(ISIN, 추적 지수, 총 비용 기준)에 맞춰 설계되었으며, 거래소 중복은 통합되어 6개 거래소에 상장된 하나의 펀드가 6개의 선택지가 아닌 하나의 선택지로 표시됩니다.

도구

기능

screen_etfs

전체 펀드 유니버스를 총보수율, 순자산, 수익률, 추적 수익률, 변동성, 유동성, 상위 10개 집중도 및 펀드 연령으로 스크리닝하고, 발행사, 지수, 소재지, UCITS 상태, 분배 정책 및 통화 헤징과 결합 — 추가로 룩스루(holdingSearch)를 통해 보유 종목 기준으로 펀드를 찾습니다.

get_etf_index_group

"S&P 500 / MSCI World를 추적하는 가장 저렴한 방법?" — 하나의 지수에 대한 모든 펀드, 가장 저렴한 순서, 펀드당 한 행과 거래소, 그리고 수수료를 공개하지 않는 펀드의 명시적 개수.

get_etf_fund

ISIN(또는 모든 거래소 티커)을 펀드와 해당 펀드가 거래되는 모든 거래소로 확인합니다.

get_etf_filter_options

범주형 필터가 허용하는 정확한 값으로, 추측한 문자열에 대해 스크린이 조용히 아무것도 반환하지 않도록 합니다.

search_etfs

알려진 펀드를 이름, 티커 또는 ISIN으로 조회하고, 분류, 지수, 비용 및 수익률 필터를 제공합니다.

get_etf_snapshot

하나의 상장 종목에 대한 모듈식 스냅샷 — 식별 정보, 분류, 시장, NAV/AUM, 비용, 소득, 벤치마크.

get_etf_holdings

명시적 부분 적용 계약이 포함된 페이지별 구성 종목.

get_etf_exposures

섹터/국가/발행사 익스포저에 대한 보유 종목 룩스루.

get_etf_timeseries

가격 이력, 사용 불가능한 NAV/총수익률/프리미엄-할인 시리즈는 합성되지 않고 명명됨.

get_etf_risk

변동성, 최대 낙폭, Sharpe/Sortino/Calmar, VaR, 그리고 벤치마크 대비 베타 및 추적 오차.

compare_etfs

비용, 성과, 위험 및 보유 종목의 나란히 비교.

analyze_etf_overlap

펀드 간 공유 보유 종목 및 가중치 기반 하한 중복.

simulate_etf_cost

총보수율, 스프레드, 수수료 및 기여금을 기반으로 한 결정론적 다년 비용 시나리오.

analyze_portfolio_fit

후보 펀드가 기존 포트폴리오에 어떻게 적합할지 분석. (로그인 필요)

query_etfs

원래 ETF 검색. 호환성을 위해 유지됨. screen_etfs 또는 search_etfs 사용을 권장합니다.

포트폴리오

도구

기능

get_capabilities

연결된 계정, Pro 활성화 여부, 부여된 범위 및 게이트된 도구를 확인합니다.

list_portfolios

가치, 일일 변동, 원가 기준 및 총 수익률이 포함된 가상 포트폴리오. (로그인 필요)

get_portfolio_context

하나의 포트폴리오에 대한 심층 스냅샷: 비중, 섹터 및 수익률이 포함된 모든 보유 종목, Bullrun의 인사이트 포함. (로그인 필요)

get_portfolio_analytics

상관관계/공분산, 위험 기여도, 팩터 익스포저, 섹터/통화/국가 집중도, 스트레스 시나리오 및 후보 적합도 분석. (로그인 필요)

create_portfolio_from_positions

이미 결정한 포트폴리오를 명시적 {ticker, weight} 바스켓을 그대로 사용하여 저장합니다. (로그인 필요, Pro 불필요)

create_portfolio_draft

일반 영어 브리핑에서 새로운 종이 포트폴리오 초안을 작성합니다. 초안 전용 — 검토를 위해 저장되며 실제 포지션을 변경하지 않습니다. (Pro)

create_position_draft

기존 포트폴리오에 추가할 종목을 제안합니다. 초안 전용 — 검토를 위해 저장됩니다. (Pro)

인증 및 개인정보

서버는 OAuth 2.0으로 보호되는 리소스입니다(RFC 9728). 처음 연결 시 클라이언트는 자동 검색 핸드셰이크를 실행하고 Google 로그인을 통해 사용자를 안내합니다. 사용자가 승인하면 사용자별 도구가 Bullrun 계정을 확인합니다. MCP 계층은 자체 데이터베이스가 없는 얇은 프록시입니다. 읽기 도구는 시장 데이터와 사용자의 보유 자산을 반환하고, 사용자별 읽기 도구는 privacyMode(full 기본값 또는 상대 수치만 반환하는 weights_only)를 허용하며, 초안 도구는 실제 보유 자산을 변경하지 않습니다. 개인정보 처리방침을 참조하세요.

로컬 stdio 빌드

위의 호스팅 엔드포인트가 권장되는 통합 방식입니다. 로컬 MCP 서버를 빌드하고 실행해야 하는 디렉터리의 경우, 이 저장소는 stdio를 통해 MCP 계층을 실행할 수 있습니다.

npm ci
npm run build
BULLRUN_API_BASE=https://bull-run.org node dist/stdio.js

공개 시장 데이터 도구는 자격 증명 없이 작동합니다. 포트폴리오 및 초안 도구는 호스팅 클라이언트에서 여전히 Bullrun OAuth 토큰이 필요하며, 익명 stdio 검사에서는 인증 필요 오류를 반환합니다.

라이선스

MIT.

Available Tools

14 tools
create_portfolio_draftCreate a portfolio draftAInspect

Use when the user wants you to BUILD or PROPOSE a brand-new portfolio for them — e.g. "build me a portfolio", "put together a dividend portfolio", "draft a portfolio of AI stocks", "create a new portfolio for $10k". Generates a REVIEWABLE paper-portfolio draft for the signed-in Bullrun user from a natural-language brief (e.g. "a diversified European dividend portfolio"). Requires OAuth with the write:drafts scope and a Bullrun Pro account. This is DRAFT-ONLY and never changes any live position: the draft is saved to the user's account and appears in the Bullrun Portfolio tab under "Pending AI drafts", where the user reviews it and explicitly accepts it to create a new portfolio (or discards it). To suggest additions to an EXISTING portfolio instead, use create_position_draft. Tickers are chosen only from Bullrun's priced universe. If the brief is vague, first ask ONE quick round of up to three multiple-choice questions (investing style, region focus, and size), each with a default the user can accept with "just pick for me", then build; skip any dimension the user already specified and do not interrogate across multiple turns.

ParametersJSON Schema
NameRequiredDescriptionDefault
promptNoWhat 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).
maxPositionsNoMaximum number of holdings (3-20, default 10).
startingCashNoStarting cash in USD (default 10000).

TDQS

A4.8/5.0
Behavior5/5

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

Discloses that it is draft-only, never changes live positions, requires OAuth write:drafts scope and Bullrun Pro account. This adds significant context beyond the annotations, which only indicate non-read-only and non-destructive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is relatively long but well-structured with key points front-loaded. Every sentence adds value, though it could be slightly more concise without losing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 3 parameters, 100% schema coverage, and no output schema, the description covers prerequisites, behavior, interaction, and expectations. It is complete enough for an agent to use correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. Description adds extra context: explains that omitting prompt triggers user elicitation, and provides default values for maxPositions and startingCash. This adds value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: building or proposing a brand-new portfolio by generating a reviewable draft. It uses specific verbs like 'BUILD' or 'PROPOSE' and distinguishes it from create_position_draft, which handles additions to existing portfolios.

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

Usage Guidelines5/5

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

Explicitly says when to use (user wants a new portfolio) and when not to (use create_position_draft for existing portfolios). Provides guidelines for vague briefs, including asking one round of multiple-choice questions with defaults.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_position_draftCreate a position draftAInspect

Use when the user asks what to BUY or ADD to an EXISTING portfolio — e.g. "what should I buy next", "suggest a stock for my portfolio", "what should I add", "recommend a position", "any ideas to round out my holdings". Generates REVIEWABLE suggested additions for one existing Bullrun portfolio. Requires OAuth with the write:drafts scope and a Bullrun Pro account. This is DRAFT-ONLY: the suggested position(s) are saved to the user's account and appear in the Bullrun Portfolio tab under Pending AI drafts, where the user reviews and accepts them into the target portfolio or discards them. It never changes live holdings by itself. To draft a whole new portfolio from scratch use create_portfolio_draft; to test whether a specific named ticker fits, use get_portfolio_analytics with candidateTicker. If it is unclear, first confirm which portfolio (use list_portfolios when the user has more than one) and how many ideas (a single best idea or a few) in ONE quick step; otherwise just build.

ParametersJSON Schema
NameRequiredDescriptionDefault
portfolioIdYesThe Bullrun portfolio id to propose additions for. Use list_portfolios first if unsure.
maxPositionsNoHow many suggested additions to save, 1-5. Use 1 for a single-position idea; default 3.

TDQS

A4.8/5.0
Behavior5/5

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

Discloses draft-only behavior: 'saved to the user's account... never changes live holdings by itself'. Also mentions required OAuth scope and Bullrun Pro account. Annotation readOnlyHint=false and destructiveHint=false are consistent and complemented by this context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is well-structured with trigger, purpose, prerequisites, distinctions, and guidance. Each sentence serves a purpose; slightly long but earns its length. Could be more concise but effective.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, prerequisites, behavioral constraints, alternatives, and disambiguation guidance. With no output schema, description provides sufficient context for agent to decide when and how to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. Description adds value by mentioning OAuth scope and Pro account requirement, and provides usage hints for clarifying portfolio and number of ideas. Does not repeat schema descriptions but adds overall parameter usage context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool generates 'REVIEWABLE suggested additions for one existing Bullrun portfolio' and uses specific trigger phrases like 'BUY' or 'ADD' to an existing portfolio. It distinguishes itself from sibling tools like create_portfolio_draft and get_portfolio_analytics.

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

Usage Guidelines5/5

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

Provides explicit when-to-use triggers ('when the user asks what to BUY or ADD to an EXISTING portfolio'), when-not-to-use (use create_portfolio_draft for new portfolio, get_portfolio_analytics for specific ticker), and guidance for unclear cases (confirm portfolio and number of ideas).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_earnings_call_transcriptGet earnings call transcriptA
Read-only
Inspect

Fetch speaker-tagged earnings-call transcript chunks for one exact Bullrun ticker, optionally filtered by fiscal period or search text. Use this for management guidance language, analyst Q&A, and qualitative judgment that is not visible in financial statements. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
searchNoOptional case-insensitive text/speaker search across transcript chunks.
tickerYesThe ticker exactly as listed on Bullrun, e.g. "CRWD", "SPGI", "V".
maxChunksNoMaximum speaker-tagged transcript chunks to return.
fiscalYearNoOptional fiscal year filter.
fiscalQuarterNoOptional fiscal quarter filter.
maxCharsPerChunkNoMaximum characters per transcript chunk in the MCP response.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already provide readOnlyHint=true, and the description confirms "Read-only". The description adds that the tool returns "speaker-tagged" chunks and supports optional filtering, which goes beyond the annotation. No contradictions or missing critical behavioral traits (e.g., no pagination detail, but acceptable given the simplicity).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: the first succinctly describes the action and options, the second explains the use case. Every word earns its place; no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has 6 parameters (all documented in schema) and no output schema. The description explains the purpose and use case adequately. It could mention that results are ordered by speaker or time, but omitting that is a minor gap given the simplicity. The description is complete enough for an agent to understand what to expect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds meaning by explaining the purpose of filtered chunks (qualitative judgment) and emphasizing the "exact Bullrun ticker" requirement. It also frames the optional filters (fiscal period, search text) in the context of finding specific transcript content, which helps an agent select parameters meaningfully.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb "Fetch", the resource "speaker-tagged earnings-call transcript chunks", and the specific scope "for one exact Bullrun ticker". It distinguishes the tool from its siblings (which are portfolio, position, and financial metrics tools) by focusing on qualitative transcript data.

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

Usage Guidelines4/5

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

The description explicitly tells the agent to use this for "management guidance language, analyst Q&A, and qualitative judgment that is not visible in financial statements". This provides clear context for when to invoke this tool over siblings like get_financial_history or get_forward_estimates. It does not explicitly state when not to use it, but the positive guidance is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_financial_historyGet financial historyA
Read-only
Inspect

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 passed a rule such as 10% revenue and net-income growth every year.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearsNoHow many fiscal years of history to return, counting backward from the latest fiscal year available.
tickerYesThe ticker exactly as listed on Bullrun, e.g. "AAPL", "ABBN.SW", "BMW.DE".
periodTypeNoReturn annual rows, quarterly rows, or both. Annual rows use fiscalQuarter=0.both
includeEmptyRowsNoInclude sparse rows that have no major income statement, balance sheet, cash-flow, or EPS values.

TDQS

A4.4/5.0
Behavior4/5

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

The annotations include readOnlyHint: true, so the description doesn't need to reiterate that. It adds behavioral context by describing the returned structure (groups like income statement, balance sheet, etc.) and mentioning consistency checks. This goes beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured paragraph that front-loads the key action and details. Every sentence adds value: it states the fetch range, return types, data groups, and use cases. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the absence of an output schema, the description compensates by listing the return data groups (income statement, balance sheet, etc.) and mentioning specific use cases. It provides a good sense of what the tool returns, though a bit more detail on the exact output format could improve completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so parameters are well documented. The description adds meaningful context beyond the schema, such as specifying that tickers must be exact Bullrun tickers, explaining that annual rows use fiscalQuarter=0, and describing the nature of includeEmptyRows. This enriches the parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool fetches historical financial statements for a Bullrun ticker, specifying the range (1-15 years), return types (annual/quarterly), and data groups (income statement, etc.). It distinguishes well from sibling tools like get_forward_estimates or get_quality_moat_metrics.

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

Usage Guidelines4/5

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

The description explicitly says 'Use this when evaluating multi-year revenue/net-income growth, margin trajectories, leverage, cash flow quality, or whether a stock passed a rule such as 10% revenue and net-income growth every year.' This provides strong usage context, though it doesn't explicitly state when not to use it or name alternative tools for different purposes.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_forward_estimatesGet forward estimatesA
Read-only
Inspect

Fetch forward consensus revenue/EPS/EBITDA estimates, management guidance ranges, and estimate-revision percentages for one exact Bullrun ticker. Also derives simple forward P/E and PEG-style context from the latest close when EPS estimates are available. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum estimate rows to return.
tickerYesThe ticker exactly as listed on Bullrun, e.g. "AAPL", "CRWD", "SPGI".
periodTypeNoReturn annual estimates, quarterly estimates, or both.both

TDQS

A4.4/5.0
Behavior5/5

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

The description adds significant value beyond the readOnlyHint annotation by stating that the tool derives P/E and PEG context from the latest close, and it explicitly marks itself as read-only. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each providing distinct value: core function, derived context, and read-only designation. No superfluous words; well front-loaded with the main purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 3 parameters and no output schema, the description covers the main return data (estimates, guidance, revisions, derived metrics). It lacks details on pagination or error handling, but these are not critical for basic usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage, the description does not need to repeat parameter details but adds context about the type of estimates (revenue, EPS, EBITDA) which relates to the output. It does not provide additional parameter syntax or behavior beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the verb 'Fetch' and the resource 'forward consensus revenue/EPS/EBITDA estimates' for a specific Bullrun ticker, clearly distinguishing it from sibling tools like 'get_earnings_call_transcript' or 'get_financial_history' which cover other data types.

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

Usage Guidelines4/5

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

The description clearly states it is for 'one exact Bullrun ticker', implying it should not be used for multiple tickers or other platforms. However, it does not explicitly exclude alternative uses or mention sibling tools for comparison.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_operating_kpisGet operating KPIsA
Read-only
Inspect

Fetch period-specific operating KPIs and unit-economics metrics for one exact Bullrun ticker: ARR, net revenue retention, RPO, billings, customer counts, payments volume, cross-border volume, processed transactions, or other domain-specific metrics when populated. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum KPI rows to return.
tickerYesThe ticker exactly as listed on Bullrun, e.g. "CRWD", "SNOW", "V".
categoryNoOptional category filter such as SaaS, payments, marketplace, banking, or other domain labels.
metricKeyNoOptional exact metric key to filter, e.g. ARR, NRR, RPO, BILLINGS, PAYMENT_VOLUME.

TDQS

A4/5.0
Behavior3/5

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

The annotation declares readOnlyHint: true, and the description repeats 'Read-only'. This is consistent and adds no contradiction. However, beyond that, the description does not disclose additional behavioral traits such as pagination, error handling, or rate limits. Given the annotation covers the safety profile, a score of 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no superfluous words. The first sentence conveys the purpose and examples, the second confirms idempotency. Highly efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description lists example metrics, which helps the agent anticipate return values. It also specifies that the ticker must be exact. It does not mention result ordering or pagination limits (though limit parameter exists), but overall it is complete enough for a read-only data retrieval tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all parameters. The description lists example values for ticker, category, and metricKey but does not add significant meaning beyond the schema. The baseline of 3 is correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool fetches operating KPIs and unit-economics metrics for a specific ticker, listing concrete examples like ARR, NRR, RPO. This distinguishes it from sibling tools that handle financial history, transcripts, etc.

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

Usage Guidelines4/5

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

The description says 'for one exact Bullrun ticker', implying a required ticker. It provides context about period-specific KPIs but does not explicitly state when to use this tool vs. alternatives like get_financial_history or get_forward_estimates. However, the examples differentiate it sufficiently.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_portfolio_analyticsGet portfolio analyticsA
Read-only
Inspect

Use when the user asks about THEIR portfolio's risk, diversification, or concentration, or whether to add a stock — e.g. "is my portfolio diversified", "how risky is my portfolio", "am I too concentrated", "what's my exposure to X", "should I add NVDA", "would AAPL improve my diversification". Fetches portfolio-level relationship analytics for one signed-in user's portfolio: correlation and annualized covariance matrices across holdings, contribution-to-risk, concentration by weight and risk, currency/sector/country exposures, value/growth/momentum/quality/size proxy factor scores, scenario/stress tests (rates +100bp, oil -20%, USD +10%), and optional candidateTicker fit analysis showing correlation to the current portfolio plus pro-forma volatility (set candidateTicker when the user asks whether to add a specific stock). Pass a portfolioId from list_portfolios. The risk math only covers holdings with enough price history, dropping unpriced/unmatched ones (ETFs, funds, untracked tickers) and renormalizing all percentages over what remains; the response leads with a coverage banner (first text block) stating how many holdings were excluded, so never read these figures as the whole portfolio. For a plain holdings/value snapshot and the full matched/unmatched breakdown use get_portfolio_context instead. Requires OAuth (read:portfolios) and returns the caller's own data only. privacyMode defaults to "full"; "weights_only" hides absolute USD amounts while keeping weights, percentages, correlations and scores.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoCalendar-day lookback for daily USD return analytics. Default 370.
portfolioIdYesThe portfolio id, as returned by list_portfolios.
privacyModeNo"full" (default) includes absolute USD amounts; "weights_only" returns only relative figures.
candidateTickerNoOptional exact Bullrun ticker to test as a candidate diversifier, e.g. AAPL, NESN.SW, BMW.DE.
candidateWeightPctNoOptional hypothetical candidate allocation for pro-forma volatility. Default 5 (%).

TDQS

A4.8/5.0
Behavior5/5

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

Discloses important behaviors beyond annotations: risk math drops unpriced holdings, coverage banner, privacyMode effects, OAuth requirements. Consistent with readOnlyHint annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with use cases first, then technical details. Slightly verbose but all sentences add value. Could be tightened slightly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, description thoroughly explains what analytics are returned (correlation matrices, contributions, exposures, scenario tests) and warns about coverage limitations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema already documents all parameters (100% coverage). Description adds context for candidateTicker and candidateWeightPct, explaining their purpose in candidate diversification analysis.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it fetches portfolio-level relationship analytics for risk, diversification, concentration, and adding stocks. It distinguishes from sibling get_portfolio_context.

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

Usage Guidelines5/5

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

Explicitly states when to use (portfolio risk/diversification/concentration queries) and when not to (use get_portfolio_context for plain holdings snapshot).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_portfolio_contextGet portfolio contextA
Read-only
Inspect

Use when the user asks to look at, review, or analyze THEIR portfolio / holdings / positions — e.g. "analyze my portfolio", "how is my portfolio doing", "what's in my portfolio", "review my holdings", "how am I invested", "what should I improve". Fetches a deep snapshot of ONE of the signed-in user's portfolios: the summary (value, day change, total return), every holding (with position weight %, sector and return) and Bullrun's computed insights (benchmark comparison, concentration, diversification, dividend income). Pass a portfolioId from list_portfolios (call that first if the user hasn't named a portfolio). The response ALWAYS returns the complete holdings list with each position flagged matched/unmatched, plus a coverage summary: holdings that Bullrun can't link to its universe (ETFs, funds, untracked tickers) carry no weight, sector, insight or ML score, so weights/insights/ML below describe ONLY the matched subset. Read the coverage banner (the first text block) and never present matched-only figures as the whole portfolio. For risk/diversification math, correlations, factor exposure, or whether to add a specific stock, use get_portfolio_analytics instead. Requires OAuth (read:portfolios) and returns the caller's own data only. privacyMode defaults to "full" (absolute $ included); "weights_only" returns only relative figures. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoInsights look-back window in days (default 30).
portfolioIdYesThe portfolio id, as returned by list_portfolios.
privacyModeNo"full" (default) includes absolute $; "weights_only" returns only relative figures.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the description doesn't need to reiterate safety. However, it adds critical behavioral context: the response always returns a complete holdings list with matched/unmatched flags, a coverage summary, and warns against presenting matched-only figures as the whole portfolio. This is valuable beyond the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is somewhat long but well-structured: usage guidance first, followed by response structure details, caveats, and alternative tool reference. Every sentence adds value, though it could be slightly tighter without losing clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description fully explains the return shape (summary, holdings, insights, coverage banner). It also covers privacyMode and clarifies that holdings may lack weight/sector/insight for unmatched items. This is exceptionally complete for a non-trivial tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% (each parameter has a description). The description adds value by explaining portfolioId's origin ('from list_portfolios'), clarifying days as a look-back window, and illustrating privacyMode's effect on output format. This enriches the schema's baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with explicit use cases ('Use when the user asks to look at, review, or analyze THEIR portfolio / holdings / positions') and provides concrete example queries. It clearly distinguishes the tool from siblings like get_portfolio_analytics by naming that alternative for risk/diversification analysis.

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

Usage Guidelines5/5

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

The description explicitly states when to use (portfolio review/analysis), when not to use for risk analytics (points to get_portfolio_analytics), and instructs to call list_portfolios first if portfolio ID is unknown. This provides clear decision guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_quality_moat_metricsGet quality and moat metricsA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearsNoHow many fiscal years of annual history to evaluate.
tickerYesThe ticker exactly as listed on Bullrun, e.g. "AAPL", "ABBN.SW", "BMW.DE".
estimatedWaccPctNoOptional user-supplied WACC assumption, in percent. When omitted, ROIC-vs-WACC spread is returned as null.
taxRateFallbackPctNoFallback tax rate used for NOPAT only when reported tax/pretax data is missing or unusable.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true. The description goes beyond by listing computed metrics, explaining parameter effects (e.g., WACC fallback, tax-rate fallback), and stating it uses existing financial statements. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is efficient: two sentences that immediately state purpose, list metrics, and note read-only nature. No fluff, well front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given complexity (4 params, no output schema), description covers purpose, metrics, parameter behavior, and read-only nature. It does not specify the output format or structure, which would be helpful for an agent, but overall it is fairly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers 100% of parameters with descriptions. The description adds value by explaining that ROIC-vs-WACC spread returns null when WACC is omitted and that taxRateFallbackPct only used when reported data missing. This enhances understanding beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool computes annual quality and moat metrics for a single Bullrun ticker, listing specific metrics (ROIC, ROE/ROA, etc.). This distinguishes it from siblings like get_financial_history or get_stock_metrics, which handle raw data or different analyses.

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

Usage Guidelines3/5

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

The description explains what the tool does but does not explicitly state when to use it versus alternatives or when not to use it. It implies usage for a single ticker but lacks guidance on context or exclusion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_revenue_breakdownGet revenue breakdownA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum breakdown rows to return.
tickerYesThe ticker exactly as listed on Bullrun, e.g. "SPGI", "MSFT", "V".
dimensionNoBreakdown dimension to return, or all dimensions.all

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, and the description confirms 'Read-only.' Beyond that, it adds minimal behavioral context (e.g., no mention of rate limits, pagination, or error handling). The description is adequate but does not significantly enrich behavioral transparency beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences front-loaded with action and resource, followed by usage guidance and a read-only note. Every sentence adds value with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (3 parameters, no output schema), the description covers what, when, and safety. It could mention that return format is an array of rows, but that's implicitly understood from 'rows'. Slightly incomplete but largely sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description mentions the dimension types (segment, geography, etc.) but the schema already defines them via an enum. No additional parameter semantics beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The verb 'Fetch' and specific resource 'revenue breakdown rows for one exact Bullrun ticker' clearly state the tool's function. It distinguishes from siblings like get_financial_history by focusing on revenue breakdowns and exact ticker-level data.

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

Usage Guidelines4/5

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

Explicitly provides use cases: 'separate cyclical businesses from recurring segments or inspect geographic exposure instead of relying on blended revenue.' This gives strong context for when to use, though it lacks explicit when-not-to-use or alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_stock_metricsGet stock metricsA
Read-only
Inspect

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, total assets, equity) and a short company description. Use the exact ticker as listed on Bullrun (Yahoo-style suffixes, e.g. AAPL, ABBN.SW, BMW.DE). Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
tickerYesThe stock ticker exactly as listed on Bullrun, e.g. "AAPL", "ABBN.SW", "BMW.DE".

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description adds 'Read-only', confirming no side effects. The description details exactly what data is returned, but does not discuss rate limits, data freshness, or authorization requirements. The transparency is good but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise: two sentences. The first sentence efficiently lists all data categories, and the second provides a critical usage instruction. No redundant or filler content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (multiple metric categories) and the absence of an output schema, the description adequately enumerates the returned data (identity, price, valuation, financials, description). It does not specify data structure or units, but the categories are sufficient for an AI agent to understand the tool's output.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single parameter (ticker), with a clear description. The description adds value by reiterating the ticker format and providing examples (e.g., AAPL, ABBN.SW), which helps disambiguate usage beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool fetches a consolidated metrics snapshot for a single stock by ticker, listing specific categories (identity, price, valuation, financials, description). This clearly distinguishes it from sibling tools like get_financial_history or get_earnings_call_transcript, which focus on narrower aspects.

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

Usage Guidelines4/5

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

The description includes a usage guideline to use the exact ticker as listed on Bullrun with Yahoo-style suffixes, providing examples. While it does not explicitly state when not to use this tool or compare to alternatives, the broad snapshot nature implies it is for a quick overview, and the parameter guidance is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_portfoliosList my portfoliosA
Read-only
Inspect

Use when the user refers to THEIR portfolio(s) or holdings — e.g. "my portfolios", "what portfolios do I have", "how are my investments doing", "show my holdings", "my account". Lists the signed-in Bullrun user's virtual portfolios with computed summaries: name, base currency, total value (USD), day change, cost basis and total return, plus position counts. Start here when a portfolio question doesn't name a specific portfolio, then pass a portfolioId to get_portfolio_context or get_portfolio_analytics. Requires connecting this server to a Bullrun account (OAuth, read:portfolios scope) — it returns that user's own data only. privacyMode defaults to "full" (includes absolute $ amounts); pass "weights_only" to hide absolute money and return only relative figures (returns %, counts). Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
privacyModeNo"full" (default) includes absolute $; "weights_only" hides cash/value/cost-basis and keeps only %.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations provide readOnlyHint=true, and description adds OAuth requirement, user-specific data limitation, privacyMode behavior, and read-only nature. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with purpose first, then details. Slightly verbose but every sentence adds value. Could be shortened without loss.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all necessary aspects: purpose, prerequisites (OAuth), return value, parameters, privacy mode, and relationship to sibling tools. No output schema needed for this list operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter (privacyMode) with 100% schema coverage. Description adds context beyond enum values: explains defaults and effect on returned data. Slightly redundant with schema description but clear.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description uses specific verb 'list' and resource 'portfolios', explains it returns computed summaries, and distinguishes from siblings by stating 'start here when a portfolio question doesn't name a specific portfolio'.

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

Usage Guidelines4/5

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

Explicitly states when to use (user refers to 'their' portfolios/holdings) with examples. Provides clear context: start here, then pass portfolioId to get_portfolio_context/analytics. Does not mention when not to use or list alternatives, but the guidance is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_etfsQuery ETFsA
Read-only
Inspect

Search the Bullrun ETF universe by ticker/fund name plus ETF category, focus, domicile, exchange and currency. For an exact ticker, returns ETF profile details, recent historical price rows, and latest holdings. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
focusNoExact ETF focus filter. This maps to Bullrun's ETF focus / asset-class column.
limitNoMaximum ETF search rows to return, 1-100.
searchNoFree-text ETF search by ticker or fund name. Omit to list the first ETFs.
tickerNoExact ETF ticker for profile, prices, and optional holdings, e.g. SPY, VWRL.L, EUNL.DE.
categoryNoExact ETF category filter. This maps to Bullrun's ETF category column.
currencyNoExact trading currency filter, e.g. USD, EUR, CHF.
domicileNoExact ETF domicile filter.
exchangeNoExact exchange filter, e.g. NYSE ARCA, LSE, XETRA.
priceLimitNoRecent daily price rows to return for an exact ticker. Use 0 to skip prices.
holdingsLimitNoMaximum holdings to return for an exact ticker, 1-100.
includeHoldingsNoWhen ticker is supplied, include latest holdings. Ignored for broad searches.
includeInactiveNoInclude ETFs with no recent price bar. Default false.
includeSecondaryNoInclude secondary/cross-listed ETF tickers. Default false.

TDQS

A4/5.0
Behavior3/5

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

Annotations already provide readOnlyHint=true, so no destructive behavior. Description adds return details (profile, prices, holdings) but no further behavioral traits like rate limits or permissions. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with core functionality, no fluff. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite 13 parameters and no output schema, the description gives a clear overview of search capabilities and exact-ticker returns. Could elaborate on output structure, but current level is adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with each parameter individually described. The tool description provides some context (e.g., 'maps to Bullrun's ETF focus column') but doesn't significantly add beyond the schema. Baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description uses specific verb 'Search' and resource 'Bullrun ETF universe', lists search criteria (ticker/fund name, category, focus, domicile, exchange, currency), and distinguishes exact-ticker returns (profile, prices, holdings). It also states 'Read-only', aligning with annotations.

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

Usage Guidelines4/5

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

Clearly states when to use (searching ETFs) and what inputs are available. Does not explicitly mention when not to use or alternatives among siblings, but the context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

screen_stocksScreen stocksA
Read-only
Inspect

Screen the global Bullrun stock universe with the same rule engine as the app screener. Filter by sector, industry, country/countries, primary vs secondary listings, active vs inactive listings, lookback mode, AND/OR rule groups, comparison operators, money units, growth metrics and latest-value metrics. Returns a compact table of matching stocks. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoDeprecated alias for lookbackMode; kept for compatibility.
limitNoMaximum number of stocks to return (1-100).
orderNoSort direction. Nulls always sort last regardless of direction.desc
rulesNoFundamental rules. Same groupId means AND; different groupIds mean OR.
sectorNoExact sector name to filter by, e.g. "Technology", "Healthcare". Omit for all sectors.
sortByNoMetric to sort by. revenueGrowth is accepted as an alias for revenueGrowthPct.marketCap
countryNoExact country name to filter by, e.g. "United States", "Germany". Omit for all countries.
periodsNoDeprecated alias for lookback; kept for compatibility.
industryNoExact industry name to filter by, e.g. "Software - Infrastructure". Omit for all industries.
lookbackNoHow many reporting periods to evaluate. Growth rules need at least 2 comparable periods.
countriesNoExact country names to include. Use this for multi-country screens; it overrides country when provided.
lookbackModeNoWhether rule evaluation uses annual or quarterly reporting periods.annual
minMarketCapNoCompatibility shortcut: adds marketCap >= this absolute value to every rule group.
includeInactiveNoInclude delisted/inactive tickers with no recent price bar. Default false.
includeSecondaryNoInclude secondary cross-listings of the same security. Default false (primary listings only).

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description reinforces this with 'Read-only'. It adds context about using the same rule engine as the app screener and returning a compact table, which is helpful beyond the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: two sentences that capture the tool's purpose, scope, and result type. Every word adds value, with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (15 parameters, no output schema), the description provides a solid overview. The schema handles detailed parameter info. It could mention default values or array behavior, but overall it's reasonably complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description synthesizes the parameters into a coherent narrative (e.g., 'AND/OR rule groups', 'comparison operators', 'money units'). This adds meaning beyond individual parameter descriptions, earning a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool screens the Bullrun stock universe using the same rule engine as the app, and lists the many filtering criteria. It distinguishes itself from sibling tools like get_stock_metrics and query_etfs by focusing on screening with complex rule logic.

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

Usage Guidelines4/5

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

The description implicitly explains when to use this tool (to filter stocks by various criteria), but does not explicitly contrast with alternatives or state when not to use it. The context is clear enough for an agent to decide, but lacks explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 14 tool updatesv0.1.0
    • First observedcreate_portfolio_draft
    • First observedcreate_position_draft
    • First observedget_earnings_call_transcript
    • First observedget_financial_history
    • First observedget_forward_estimates
    • First observedget_operating_kpis
    • First observedget_portfolio_analytics
    • First observedget_portfolio_context
    • First observedget_quality_moat_metrics
    • First observedget_revenue_breakdown
    • First observedget_stock_metrics
    • First observedlist_portfolios
    • First observedquery_etfs
    • First observedscreen_stocks

TDQS

A4.4/5.0

Scored across 14 tools

Disambiguation5/5

Each tool targets a distinct action or data type: portfolio vs position drafts, holdings snapshot vs risk analytics, and separate financial data queries. No two tools overlap in purpose.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern (e.g., create_portfolio_draft, get_financial_history, list_portfolios). The naming is clear and predictable.

Tool Count5/5

14 tools cover the core functionalities of portfolio management and financial research without being excessive or sparse. The scope is well-defined.

Completeness5/5

The tool surface provides comprehensive coverage: portfolio CRUD (draft creation), analytics, screening, and fundamental data. Users can perform end-to-end portfolio analysis and suggestions.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

  • Research US-listed companies and funds with the StockPortfolio.pro MCP server. Tools cover SEC filing-grounded financials, filing timelines, company comparisons, watchlist screens, fund profiles, and cited filing questions. Filed figures include their fiscal period and EDGAR source URL; missing filing data is returned as null. Public tools work without authentication; optional API-key or OAuth access is supported. US-listed, USD-reporting companies only. Keyless access includes 3 free AI questions per rolling 30-day window. To get more now, choose the Dev plan ($19.99/month, 200 credits) at https://www.stockportfolio.pro/register?plan=dev, then follow https://www.stockportfolio.pro/docs/api-mcp to connect with OAuth or an API key. Or wait for the free allowance to renew.

  • Stock analysis MCP: 38 indicators, 7 optimizers, 8 backtests, US + India sectors.

  • Finnhub MCP — wraps Finnhub Stock API (finnhub.io)

  • Multi-tenant FastMCP server for Charles Schwab brokerage data, monetized via DPYC Tollbooth

Related MCP Servers

  • A
    license
    B
    quality
    C
    maintenance
    MCP server that provides AI assistants access to stock market data including financial statements, stock prices, and market news through a Model Context Protocol interface.
    11
    2,301
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    A simple MCP server for Yahoo Finance using yfinance. This server provides a set of tools to fetch stock data, news, and other financial information.
    15
    197
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    A Python-based FastMCP server that provides financial tools for securities analysis, including market data, news, fundamental/technical analysis, and visualization capabilities that can be consumed by any MCP-aware client.
    8
    -
  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    An MCP server that enables Amazon Q CLI users to create, query, and manage Maverick sites through natural language commands.
    -