Skip to main content
Glama

FinBridge

Server Details

Korea-first financial data for AI agents: DART and SEC EDGAR filings, normalized financials, business segments, adjusted Korean prices, valuation and nightly strategy screeners (Minervini, CAN SLIM, VCP). Japan (EDINET) and Taiwan (TWSE/TPEx) on the same schema. 35 tools, free tier (100 metered calls/day, no card), only redistributable primary sources. Docs: https://www.gronox.kr/docs

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Unhealthy
OAuth
Works in Glama
Last Tested
Transport
Streamable HTTP
URL

Available Tools

37 tools
add_to_watchlistAdd to WatchlistAInspect

Add a company to the user's watchlist, or remove it if it is already there (toggle).

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYesStock code, ticker or company name

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNo
errorNo
totalNo
marketNo
symbolNo
watchedNo

TDQS

A4.3/5.0
Behavior4/5

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

The annotations already indicate this is not read-only and not idempotent. The description adds the crucial behavioral detail that the operation can remove an existing watchlist entry, not just add one. This is meaningful context beyond the structured annotations and helps the agent predict side effects.

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 entire description is one efficient sentence that states the action and the toggle behavior without fluff. Every part earns its place, and the key behavior is front-loaded.

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?

For a single-parameter tool with an output schema and annotations already present, the description covers everything needed to invoke it correctly: what it does, the toggle side effect, and the only input. There are no significant missing details.

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%: the schema already specifies that 'symbol' is a stock code, ticker, or company name. The description adds no additional parameter-level meaning beyond that, so the baseline score applies.

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 states a specific verb ('Add') and resource ('company to the user's watchlist'), and immediately clarifies the toggle behavior: it removes the company if it is already present. This makes the tool's function unambiguous and distinct from the sibling tools, none of which target watchlist toggling.

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 makes the usage context clear: use this tool to add a company to the watchlist, and the same call will remove it if already present. It does not explicitly list alternatives or when-not-to-use conditions, but no sibling tool offers this watchlist-toggle capability, so the guidance is sufficient.

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

analyze_factorsFactor Study (FinBridge DB)A
Read-only
Inspect

Measure whether a ranking signal actually separates future returns, point-in-time, on KR/US/TW daily bars from the local finbridge.db. This is the question that comes BEFORE a screener: not "which names pass today" but "does this axis pay at all".

Three answers per factor:

  • Quantile portfolios: at every rebalance the investable set is sorted on the factor and cut into N buckets; you get each bucket's average forward return. A real signal is monotonic from Q1 to QN. If only the ends move and the middle is noise, that is a tail, not a signal.

  • IC (information coefficient): the cross-sectional Spearman correlation between factor rank and forward-return rank at each date. mean is the strength of the direction; ir = mean/stdev is how consistently it holds. A high mean with a low IR was made by a few regimes.

  • Correlation matrix: average rank correlation between the factors themselves. Two factors that see the same thing do not diversify each other.

Price factors (any market with bars, and the default set): mom_12_1 (12-month return skipping the last month), reversal_1m, trend_50_200, range_52w (position in the 52-week band), volatility_60d, liquidity (a control, since the investable set is already ranked on it).

Fundamental factors (KR and US only, request them explicitly): earnings_yield (diluted EPS / price), roe, net_margin, gross_margin, debt_ratio, asset_growth (YoY total assets), accruals ((net income − operating cash flow) / assets). Two more need market capitalisation and are therefore US only: book_yield (equity / market cap, the inverse of P/B) and sales_yield (revenue / market cap). Their market cap uses the share count that was already reported on the signal date, never today's — elsewhere we hold only today's share count, and multiplying a 2022 price by a 2026 share count is not a 2022 market cap, so those markets are refused with an explicit error. Each reads only the annual report that was ALREADY PUBLIC on the signal date. They rank fewer names than price factors, so every factor carries coverage_pct — read it before putting a 40%-coverage spread next to a 100%-coverage one. Taiwan is refused for these with an explicit error rather than a near-empty table, because TWSE publishes a latest-period snapshot instead of a series. Book/price and sales/price are absent on purpose: they need market cap, and we have no history of shares outstanding.

Args:

  • market: 'kr' | 'us' | 'tw' (required). Japan and Europe carry no price data, so they cannot be studied here.

  • years: history window, 2-20 (default 5). US bars start 2023-03-28 (volume from 2024-07-01), so US windows are shallower.

  • hold: forward-return window in trading days, 5-250 (default 20).

  • rebalance: trading days between measurement dates, 5-250 (default 20). Set equal to hold for non-overlapping, inference-ready observations.

  • quantiles: 3-10 buckets (default 5).

  • universe: how many of the most-traded names form the investable set, 20-1000 (default 300).

  • factors: subset of the keys above; omit for the six price factors. Fundamental factors are never in the default set — name them.

  • slippage_bps: one-way slippage assumption used only for the reported cost figure (default 5).

Returns: {range, universe, rebalances, overlapping, cost_per_rebalance_pct, factors[]{key, label, definition, fundamental, coverage_pct, asfiled_pct, report_age_days, monotonic, quantiles[]{q, avg_return, median_return, win_rate, avg_names}, long_short{avg, net_avg, t_stat, positive_share, turnover}, ic{mean, stdev, ir, t_stat, positive_share, dates}}, correlation[][], caveats[]}.

Reading the numbers: ic.ir is mean/stdev and is NOT a t-statistic — ic.t_stat is. The two long-short and IC t-statistics can disagree, and that disagreement is information: in a 2026-09 Korean run earnings_yield had an IC IR of 0.90 while its long-short t was 1.39, meaning the signal was spread broadly across the ranking while the extreme buckets themselves were noisy. report_age_days is how stale the annual report was at the signal date; it is also the look-ahead guard, since a negative value would mean a report was used before it was public.

Examples:

  • Does momentum pay in Korea? {market:'kr', factors:['mom_12_1','reversal_1m'], hold:20, rebalance:20}

  • Inference-ready quarterly study: {market:'us', hold:60, rebalance:60, years:3}

  • Does cheapness or quality pay in Korea? {market:'kr', factors:['earnings_yield','roe','accruals','asset_growth'], hold:60, rebalance:60}

  • Do value and momentum overlap? {market:'kr', factors:['earnings_yield','mom_12_1']} — read the correlation cell, not just the two spreads.

Use when: judging whether a ranking rule is worth building a screen on, comparing candidate signals, or checking whether two signals overlap. Don't use for: picking names today (screeners), simulating a specific portfolio (backtest_portfolio), or any factor that needs market capitalisation (PBR, PSR) — we hold no history of shares outstanding. Errors: a market with no price data, or a window too short for the warm-up (260 sessions plus the hold) -> explicit error, not an empty result. Notes: Returns are GROSS — signal strength and trading friction are separate questions, so cost is reported next to it (long_short.net_avg subtracts measured turnover times the round-trip cost). Delisted names are included. Dividends are excluded in every market. Fundamental factors update once a year and carry a small restatement look-ahead (the stored figures are the latest values under the original filing date). Simulation on historical data, not investment advice; a factor that worked in one window can stop working.

ParametersJSON Schema
NameRequiredDescriptionDefault
holdNoForward-return window in trading days (default 20)
labelNoName this study so you can find it again with get_backtest_runs (it is saved either way).
yearsNoHistory window in years (default 5)
marketYesMarket with daily bars: 'kr', 'us' or 'tw'
factorsNoSubset of factors; omit for the price set (mom_12_1, reversal_1m, trend_50_200, range_52w, volatility_60d, liquidity). Fundamental keys (KR/US only): book_yield, sales_yield, earnings_yield, roe, net_margin, gross_margin, debt_ratio, asset_growth, accruals
universeNoMost-traded names forming the investable set (default 300)
quantilesNoNumber of buckets (default 5)
rebalanceNoTrading days between measurement dates (default 20). Equal to hold = non-overlapping observations.
slippage_bpsNoOne-way slippage in bp used for the reported cost figure (default 5)
response_formatNo'markdown' for tables, 'json' for compact machine-readable outputmarkdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
holdYes
rangeYes
marketYes
caveatsYes
factorsYes
universeYes
quantilesYes
rebalanceYes
rebalancesYes
correlationYes
overlappingYes
cost_per_rebalance_pctYes

TDQS

A5/5.0
Behavior5/5

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

Annotations already mark it readOnlyHint=true, and the description adds substantial behavioral context: returns are gross, delisted names are included, dividends are excluded, fundamental factors carry a restatement look-ahead, and certain markets/refusals produce explicit errors. It also explains the distinction between IC IR and t-statistic, all beyond what annotations or schema 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 long, but the length is earned by the tool's complexity: 10 parameters, a large factor taxonomy, market restrictions, and subtle output semantics. It is front-loaded with the core purpose, then organized into clear sections for args, returns, examples, usage boundaries, and caveats. Every section adds decision-relevant 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?

The description covers parameter ranges, factor availability by market, data history limitations, error behavior, output interpretation, and look-ahead concerns. Even though an output schema exists, the description adds necessary interpretive context such as coverage_pct, net_avg, and the meaning of report_age_days. An agent has everything needed to call and interpret this tool correctly.

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 description coverage is 100%, but the description goes far beyond the schema by explaining the meaning of each factor, market-specific constraints, why rebalance=hold gives non-overlapping observations, the role of coverage_pct, and what slippage_bps affects. It also provides worked examples that map parameter combinations to research questions.

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 states a specific verb and resource: 'Measure whether a ranking signal actually separates future returns, point-in-time, on KR/US/TW daily bars from the local finbridge.db.' It also positions the tool relative to its siblings by saying this question comes 'BEFORE a screener', which distinguishes it from screen_canslim, screen_minervini, and similar tools.

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 gives explicit 'Use when' and 'Don't use for' sections, naming alternatives such as screeners, backtest_portfolio, and any factor requiring market capitalisation. This gives an agent clear routing criteria rather than leaving the decision to inference.

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

backtest_portfolioPortfolio Backtest (FinBridge DB)A
Read-only
Inspect

Backtest a fixed-weight KR or US portfolio on daily data from the local finbridge.db (stocks are corporate-action adjusted; US stocks are total-return where SEC-reported dividends exist). ⚠ETFs are PRICE-RETURN ONLY in every market (no distributions), AND US ETF bars are NOT split-adjusted yet — a series with a split is refused, not mispriced. US history starts 2023-03-28, so earlier start dates are clipped. Pure historical simulation — no forecasts.

Args:

  • assets: 1-15 of {symbol, weight}. symbol = KR 6-digit code ('005930'), US ticker ('AAPL', 'SPY'), or a company/ETF name. Weights are normalized to sum 1.

  • from (required, YYYY-MM-DD), to (default: today). Start is clipped to the latest asset inception date (noted).

  • rebalance: 'none'|'monthly'|'quarterly'|'yearly' (default 'yearly') — rebalanced at the close of the first trading day of each new period.

  • currency: 'USD' (default) | 'KRW' — reporting currency; assets in the other currency are converted daily (USDKRW, FRED DEXKOUS).

  • initial: starting value in the report currency (default 10000).

Returns: {period, currency, rebalance, assets[](weight_pct, first_date, dividend_adjusted, converted), metrics{total_return_pct, cagr_pct, vol_annual_pct, sharpe, mdd_pct, mdd_peak_date, mdd_trough_date, best_year, worst_year}, annual_returns[], equity_curve[](sampled, JSON only), notes[]}.

Examples:

  • Samsung + KODEX 200 70/30: {assets:[{symbol:'005930',weight:0.7},{symbol:'069500',weight:0.3}], from:'2021-01-01', currency:'KRW'}

Use when: "what if I invested in X portfolio since YYYY" questions, comparing allocations, drawdown/volatility analysis. Don't use for: single-stock history (get_stock_prices), stock screening (screeners), strategy backtests with entry/exit rules (not yet available). Errors: unknown/ambiguous symbol -> candidates list; US asset -> not-supported error (licensing); KR data before 2020 -> source-limit hint; <60 overlapping trading days -> range too short. Notes: Simulation on historical data — not investment advice. Commission, one-way slippage and sell-side tax ARE deducted on the initial purchase and every rebalance (set costs=false for a gross view); dividends on KR stocks and all ETFs are not. KR stocks are price-return only (no distributions). US stocks are total-return where SEC-reported dividends exist (see dividend_adjusted per asset; ex-dates are approximated by fiscal-quarter end), otherwise price-return. ⚠ETFs are price-return only in every market right now — distributions are not in the data, so bond, REIT and high-dividend ETFs are understated. ⚠US ETF bars are also NOT split-adjusted — splits-us reads a SEC XBRL ratio that 1940-Act funds never file (2026-09-04 scan: 200 integer-ratio split events across 186 of 5,868 US ETFs, e.g. XLK/XLU 2:1 on 2025-12-05). This backtest refuses such a series rather than mispricing it, but tools that read the bars directly (get_stock_prices, get_technicals, screeners) still see the raw jump.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoEnd date YYYY-MM-DD (default: today)
fromYesStart date YYYY-MM-DD
costsNoDeduct commission, slippage and sell-side tax on every rebalance (default true). Set false for a gross-return view.
labelNoName this run so you can find it again with get_backtest_runs (the run is saved either way).
assetsYesPortfolio assets with weights
initialNoStarting value in the report currency (default 10000)
currencyNoReporting currency (default USD)USD
benchmarkNoBenchmark symbol from the benchmarks table (KOSPI, KOSPI200, SPY, VTI, EW_KR, EW_US, EW_TW), 'auto' for the dominant market's default, or 'none'.auto
rebalanceNoRebalancing frequency (default yearly)yearly
slippage_bpsNoOne-way slippage in basis points (default 5). An assumption — we hold no quote data.
response_formatNo'markdown' for tables, 'json' for compact machine-readable outputmarkdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
notesNo
assetsYes
periodYes
initialNo
metricsYes
currencyNo
benchmarkNo
rebalanceNo
final_valueNo
equity_curveNo
annual_returnsYes

TDQS

A4.1/5.0
Behavior1/5

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

The text is rich in caveats (ETF price-return only, not split-adjusted, US history clipping, cost deductions). However, the label parameter description states the run is saved and can be found with get_backtest_runs, while annotations declare readOnlyHint=true; this persistent side effect directly contradicts the read-only annotation, so per rubric this dimension scores 1 despite the other disclosures.

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 front-loaded purpose, Args, Returns, Examples, Use/Don't-use, Errors, and Notes, and the example is useful. It is long and repeats the ETF price-return/split-adjustment and total-return caveats in both the opening warning and Notes, so it loses one point for conciseness.

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?

For an 11-parameter tool with an output schema, the definition covers input semantics, return shape, examples, error behavior, and data caveats. An agent has enough context to invoke it correctly and to interpret results, and the output schema covers return details.

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 coverage is 100%, but the description goes well beyond it: symbol resolution rules, weight normalization, start-date clipping to asset inception, rebalance timing, daily currency conversion via USDKRW/FRED DEXKOUS, initial-value default, and gross-vs-net cost behavior. This materially helps an agent construct correct arguments.

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?

Opening sentence states a specific verb, resource, and scope: 'Backtest a fixed-weight KR or US portfolio on daily data from the local finbridge.db.' The 'Don't use for' section explicitly separates it from get_stock_prices, screeners, and strategy-backtest tools, so an agent can distinguish it from siblings.

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?

'Use when' gives concrete scenarios (what-if since YYYY, comparing allocations, drawdown/volatility analysis). 'Don't use for' names sibling alternatives and the not-yet-available strategy-backtest class, leaving no ambiguity about when to call this tool.

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

compare_crypto_exchangesCompare Crypto Price Across Exchanges (Kimchi Premium)A
Read-only
Inspect

Compare the price of one crypto asset on two exchanges, converting both legs to USD, and report the premium of leg B over leg A. Classic use: the Korean "kimchi premium" — e.g. base:'BTC', exchange_a:'binance', quote_a:'USDT', exchange_b:'upbit', quote_b:'KRW' -> premium_pct is how much more expensive BTC is on upbit (in USD terms) than on binance.

Args:

  • base: asset symbol, e.g. 'BTC', 'ETH', 'XRP' (default BTC)

  • exchange_a / quote_a: first leg (defaults binance / USDT)

  • exchange_b / quote_b: second leg (defaults upbit / KRW)

  • Supported quotes: USD, USDT, USDC (treated as 1 USD, noted in output) and KRW (converted with the latest FRED DEXKOUS KRW-per-USD rate).

Returns: {base, legs:[{exchange, symbol, last, last_usd}], premium_pct, fx:{pair:'USD/KRW', rate, date, source:'FRED DEXKOUS'}, notes}. premium_pct = (leg_b_usd / leg_a_usd - 1) * 100.

Examples:

  • "what's the kimchi premium right now" -> defaults

  • "ETH premium bithumb vs kraken" -> {base:'ETH', exchange_a:'kraken', quote_a:'USD', exchange_b:'bithumb', quote_b:'KRW'}

  • Don't use for a single price (get_crypto_ticker) or history (get_crypto_ohlcv).

Errors: unknown symbol on either exchange -> check the exchange's market list (upbit/bithumb list KRW pairs only); unsupported quote currency lists the supported ones; FRED key missing blocks KRW conversion with a hint.

ParametersJSON Schema
NameRequiredDescriptionDefault
baseNoBase asset symbol, e.g. 'BTC', 'ETH'BTC
quote_aNoFirst-leg quote currency (USD | USDT | USDC | KRW)USDT
quote_bNoSecond-leg quote currency (USD | USDT | USDC | KRW)KRW
exchange_aNoFirst-leg exchange: binance | upbit | bithumb | coinbase | kraken | okx | bybit | gateio (default binance). Note: binance may be geo-blocked in some regions.binance
exchange_bNoSecond-leg exchange: binance | upbit | bithumb | coinbase | kraken | okx | bybit | gateio (default upbit). Note: binance may be geo-blocked in some regions.upbit

Output Schema

ParametersJSON Schema
NameRequiredDescription
fxNo
baseNo
legsYes
notesNo
premium_pctNo

TDQS

A5/5.0
Behavior5/5

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

Annotations declare readOnlyHint and openWorldHint, so the safety profile is already established. The description adds substantial behavioral context: KRW conversion via FRED DEXKOUS, supported quote handling, premium formula, return structure, geo-blocking caveat, and error behavior for unknown symbols and missing FRED keys.

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 organized into clear sections — summary, Args, Returns, Examples, Errors — and every sentence earns its place. The core use case is front-loaded, and the examples and error notes are compact and directly actionable.

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?

The tool is complex with 5 optional parameters, output schema, and notable caveats, and the description covers all of it: parameter defaults, supported values, conversion method, return fields, formula, example mappings, and error handling. Nothing an agent needs to call it correctly is missing.

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 coverage is 100%, so the baseline is 3, but the description goes well beyond the schema. It explains the role of each leg, default pairings, how quote currencies are treated, and gives concrete examples that map natural language to parameter values. It also documents error conditions tied to parameter choices.

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 states a clear verb and resource: compare crypto asset prices across two exchanges, convert both legs to USD, and report premium. It differentiates itself from sibling tools by explicitly naming get_crypto_ticker and get_crypto_ohlcv as non-fit alternatives.

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 gives explicit when-to-use guidance with the kimchi premium example and maps natural-language phrases to concrete argument sets. It also states exclusions: 'Don't use for a single price (get_crypto_ticker) or history (get_crypto_ohlcv).' This fully routes the agent.

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

compare_financials_kr_usCompare KR vs US Company FinancialsA
Read-only
Inspect

Compare annual financial statements of a Korean listed company (source: OpenDART, K-IFRS) and a US listed company (source: SEC EDGAR, US-GAAP) side by side, with KRW values converted to USD using FRED DEXKOUS annual-average exchange rates.

Args:

  • kr_company: Korean company name / 6-digit stock code / DART corp_code (e.g. '삼성전자', '005930')

  • us_company: US ticker / name / CIK (e.g. 'AAPL', 'Apple')

  • years: number of recent fiscal years, 1-5 (default 3)

  • metrics: subset of [revenue, gross_profit, operating_income, net_income, eps_diluted, assets, liabilities, equity, cash_and_equivalents, operating_cash_flow]

  • response_format: 'markdown' (default) or 'json'

Returns per-metric, per-year rows: {fiscal_year, kr_krw, kr_usd, us_usd, ratio_kr_over_us} plus the FX rates used and accounting-basis caveats.

Examples:

  • "삼성전자 vs Apple 최근 3년 매출·영업이익 비교" -> {kr_company:'삼성전자', us_company:'AAPL', metrics:['revenue','operating_income']}

  • Don't use for quarterly data (annual only) or non-KR/US companies.

Errors: unknown company names suggest using search_dart_company / search_edgar_company first.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearsNoHow many recent fiscal years to compare (default 3)
metricsNoMetrics to compare (default: revenue, operating_income, net_income, assets, equity). Available: revenue, gross_profit, operating_income, net_income, eps_diluted, assets, liabilities, equity, cash_and_equivalents, operating_cash_flow
kr_companyYesKorean company: name (e.g. '삼성전자'), 6-digit stock code (e.g. '005930'), or 8-digit DART corp_code
us_companyYesUS company: ticker (e.g. 'AAPL'), company name, or CIK
response_formatNo'markdown' for tables, 'json' for compact machine-readable outputmarkdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
fxNo
krYes
usYes
notesNo
metricsNo
comparisonYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, but that only covers side-effect safety. The description adds valuable behavioral context beyond annotations: KRW-to-USD conversion using FRED annual-average rates, the output row structure (per-metric, per-year with kr_krw, kr_usd, us_usd, ratio), the FX rates used, accounting-basis caveats, and the default metrics list. It does not explicitly say it makes network calls to multiple sources, but the source naming implies this adequately.

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 well-organized with a clear opening sentence, a concise args list, a return-format summary, concrete examples, and an exclusions/error section. It earns its length because it packs essential routing and usage information. Slightly lower than 5 because the args list partially duplicates the schema, but the duplication is acceptable for readability.

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 (cross-source data retrieval, FX conversion, multi-year, multi-metric comparison), the description covers nearly everything an agent needs: what it compares, what it returns, the identifiers it accepts, the annual-only limitation, and a fallback path to sibling search tools. The output schema exists, so the description correctly avoids restating return values field-by-field. It doesn't mention pagination or rate limits, but that is not critical for a comparison 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%, so the schema already thoroughly documents all five parameters. The description adds meaningful semantics on top: it clarifies the accepted identifier formats for kr_company (name / stock code / corp_code) and us_company (ticker / name / CIK), gives concrete example values, and explains how response_format affects output. It also lists the default metrics, which are not fully enumerated in the schema. This goes beyond the schema's mechanical descriptions.

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 specifies the action (compare), the two resources (KR and US company financials), the data sources (OpenDART, SEC EDGAR), accounting standards (K-IFRS, US-GAAP), and the FX conversion method (FRED DEXKOUS). It distinguishes itself from the individual get_dart_financials and get_edgar_financials siblings by focusing on cross-market comparison.

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 what the tool is for, provides concrete input examples, and adds crucial exclusions: 'Don't use for quarterly data (annual only) or non-KR/US companies.' It also gives error handling guidance ('unknown company names suggest using search_dart_company / search_edgar_company first'), which helps an agent choose between this tool and the sibling search tools.

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

get_backtest_runsSaved Backtests & Factor Studies (FinBridge)A
Read-only
Inspect

List, open, re-check or delete the backtest and factor runs saved for your account. Every backtest_portfolio and analyze_factors call is stored automatically with the exact inputs it ran on, the headline numbers, and the data vintage (the market's latest price session at the time).

Why re-check matters: in this dataset the same inputs can give a different answer later. Split adjustments get applied (225 US ETFs on 2026-09-04), financials get restated, delistings get flagged — all of which rewrite history retroactively. action='recheck' re-runs the stored inputs against today's data and reports what moved, which is the only way to notice that kind of drift.

Args:

  • action: 'list' (default) | 'get' | 'recheck' | 'delete'

  • run_id: required for get / recheck / delete

  • kind: 'portfolio' | 'factors' — filter for list

  • limit: 1-50 for list (default 20)

  • trades: include the trade log in 'get' (default false). A portfolio run stores its initial purchase, every rebalance delta and any delisting liquidation; factor studies have no trades.

Returns:

  • list: {runs: [{run_id, kind, label, market, range, data_as_of, created_at, headline}]}

  • get: {run: {...}, params, summary, trades?}

  • recheck: {run, stored, current, changed: [{key, before, after, delta}], data_as_of: {stored, now}, verdict}

  • delete: {deleted: true}

Use when: comparing runs you made earlier, auditing which trades a portfolio backtest actually made, or checking whether a saved result still holds after nightly ingests. Errors: no account on this key -> {error} rather than a failure; an unknown run_id -> {error}. Notes: Runs are per account and the newest 200 are kept. Only inputs and headline numbers are stored, never the full response — the inputs are what make a run reproducible.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoFilter the list by run type
limitNoHow many runs to list (default 20)
actionNoWhat to do (default 'list')list
run_idNoRun id — required for get / recheck / delete
tradesNoInclude the trade log in 'get' (default false)
response_formatNo'markdown' for tables, 'json' for compact machine-readable outputmarkdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
runNo
runsNo
countNo
errorNo
rangeNo
actionNo
paramsNo
run_idNo
storedNo
tradesNo
changedNo
currentNo
deletedNo
summaryNo
verdictNo
data_as_ofNo
trade_countNo

TDQS

A3.6/5.0
Behavior1/5

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

The annotations declare readOnlyHint: true, yet the description explicitly supports action='delete' and says the tool can 'delete' saved runs — a direct contradiction. Even though the description offers useful behavioral detail about rechecks, stored inputs, per-account retention and error behavior, the contradiction makes the safety profile untrustworthy and forces score 1.

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 clear sections: overview, rationale, Args, Returns, Use when, Errors, Notes. Though long, the content is information-dense and front-loaded with purpose; the main redundancy is the Args block partially duplicating the input schema.

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?

The description covers the four actions, run_id requirements, response shapes, error behavior, per-account storage limits, and the recheck/drift use case. It also leverages the high-coverage input schema and output schema, making this a complete definition for an agent to call the tool correctly.

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 and the schema already documents all six parameters. The description restates the essentials for action, run_id and kind, but adds no new meaning beyond the schema and omits exposure of limit, trades and response_format in its Args section.

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 opens with a specific multi-verb statement — 'List, open, re-check or delete the backtest and factor runs saved for your account.' It names both the operations and the resource, and explicitly ties the stored runs to backtest_portfolio and analyze_factors, which clearly separates this tool from those execution-oriented siblings.

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?

An explicit 'Use when:' block lists three concrete scenarios: comparing prior runs, auditing trades from a backtest, and checking whether saved results still hold after nightly ingests. It stops short of naming alternatives or explaining when not to use the tool, so it lacks the full when/when-not contrast.

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

get_crypto_ohlcvGet Crypto OHLCV CandlesA
Read-only
Inspect

Fetch OHLCV candlestick data (open/high/low/close/volume) for a crypto pair. No API key needed.

Args:

  • symbol: 'BASE/QUOTE' pair (default BTC/USDT)

  • exchange: binance | upbit | bithumb | coinbase | kraken | okx | bybit | gateio (default binance)

  • timeframe: 1m | 5m | 15m | 1h | 4h | 1d | 1w (default 1d)

  • since: YYYY-MM-DD start date (optional; exchange returns candles from this date forward)

  • limit: 1-500 candles (default 100)

  • response_format: 'markdown' (default) or 'json'

Returns: {exchange, symbol, timeframe, columns:["ts_iso","open","high","low","close","volume"], rows:[[...], ...]}. Rows ascend by time; prices in QUOTE currency. Cached ~5min.

Examples:

  • "BTC daily candles for the last 30 days" -> {symbol:'BTC/USDT', timeframe:'1d', limit:30}

  • "ETH/KRW hourly since July 1" -> {symbol:'ETH/KRW', exchange:'upbit', timeframe:'1h', since:'2026-07-01'}

  • Don't use for a single current price — use get_crypto_ticker.

Errors: unknown symbol -> check BASE/QUOTE and the exchange's markets; unsupported timeframe on an exchange returns the exchange's error.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of candles, 1-500 (default 100)
sinceNoStart date YYYY-MM-DD (optional)
symbolNoTrading pair as BASE/QUOTE, e.g. 'BTC/USDT'BTC/USDT
exchangeNoExchange: binance | upbit | bithumb | coinbase | kraken | okx | bybit | gateio (default binance). Note: binance may be geo-blocked in some regions.binance
timeframeNoCandle interval (default 1d)1d
response_formatNo'markdown' for a table, 'json' for compact machine-readable outputmarkdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
rowsYes
symbolYes
columnsNo
exchangeYes
timeframeNo

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already indicate readOnlyHint and openWorldHint, and the description adds meaningful behavioral detail: no API key needed, ~5min caching, ascending time order, prices in QUOTE currency, and a described error path for unknown symbols. These go well beyond the annotation hints and make the tool's behavior predictable.

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 longer than the bare minimum but well-structured with Args, Returns, Examples, and Errors sections, and every section adds practical value. Some repetition of defaults from the schema exists, but the examples and error guidance justify the length.

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?

The description is complete for a read-only data-fetching tool: it documents all six parameters, output shape, ordering, currency, caching, and error handling. Even with an output schema present, the explicit return structure and natural-language examples leave little room for an agent to misinvoke the 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 description coverage is 100%, so the baseline is 3. The description adds extra value through natural-language examples that map user intents to parameter values, explains the 'since' semantics as 'exchange returns candles from this date forward,' and clarifies response_format behavior. This is above baseline but the schema already documents most parameter meanings.

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 opens with a specific verb and resource: 'Fetch OHLCV candlestick data (open/high/low/close/volume) for a crypto pair.' It clearly distinguishes itself from the sibling get_crypto_ticker by explicitly saying it should not be used for a single current price. This makes the tool's purpose unambiguous.

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 gives explicit usage context through concrete natural-language-to-parameter examples and an explicit exclusion: 'Don't use for a single current price — use get_crypto_ticker.' It also notes exchange-specific behavior and common error cases, so an agent knows when and how to invoke it.

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

get_crypto_tickerGet Crypto TickerA
Read-only
Inspect

Fetch the current public ticker (last/bid/ask/24h stats) for a crypto trading pair on one exchange. No API key needed.

Args:

  • symbol: 'BASE/QUOTE' pair, e.g. 'BTC/USDT', 'ETH/USDT', 'BTC/KRW' (default BTC/USDT)

  • exchange: binance | upbit | bithumb | coinbase | kraken | okx | bybit | gateio (default binance)

Returns: {exchange, symbol, last, bid, ask, high_24h, low_24h, base_volume_24h, quote_volume_24h, timestamp}. Prices are in the QUOTE currency (raw numbers, no scaling). Cached ~10s.

Examples:

  • "current bitcoin price" -> {symbol:'BTC/USDT'}

  • "BTC price in Korea" -> {symbol:'BTC/KRW', exchange:'upbit'}

  • Don't use for candles/history (get_crypto_ohlcv) or cross-exchange premium (compare_crypto_exchanges).

Errors: unknown symbol -> check BASE/QUOTE format and the exchange's market list (upbit/bithumb use KRW quotes); geo-blocked exchange -> try okx.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolNoTrading pair as BASE/QUOTE, e.g. 'BTC/USDT' or 'BTC/KRW'BTC/USDT
exchangeNoExchange: binance | upbit | bithumb | coinbase | kraken | okx | bybit | gateio (default binance). Note: binance may be geo-blocked in some regions.binance

Output Schema

ParametersJSON Schema
NameRequiredDescription
askNo
bidNo
lastNo
symbolYes
low_24hNo
exchangeYes
high_24hNo
timestampNo
base_volume_24hNo
quote_volume_24hNo

TDQS

A5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, and the description adds useful behavioral context: no API key needed, ~10s caching, response fields, raw price values in quote currency, and known error modes (unknown symbol, geo-blocked exchange). No contradiction 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?

The description is front-loaded with the core purpose, then organized into clearly labeled sections: Args, Returns, Examples, Errors, Alternatives. Every section earns its place and the length is justified by the need to convey defaults, formatting, and pitfalls for a multi-exchange tool.

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 the tool has a full output schema and read-only annotations, the description is complete: it covers parameters, return structure, error handling, usage examples, and sibling differentiation. An agent has everything needed to invoke it correctly.

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 coverage is 100%, so the baseline is 3. The description goes well beyond the schema by providing concrete symbol examples ('BTC/USDT', 'BTC/KRW'), explaining that upbit/bithumb use KRW quotes, noting the geo-block fallback to okx, and mapping natural-language phrases to parameter values in examples.

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 opens with a specific verb and resource: 'Fetch the current public ticker (last/bid/ask/24h stats) for a crypto trading pair on one exchange.' This clearly distinguishes it from sibling tools, and the later line explicitly says not to use it for candles/history or cross-exchange premium.

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?

It gives concrete use cases ('current bitcoin price', 'BTC price in Korea') and explicit exclusions: 'Don't use for candles/history (get_crypto_ohlcv) or cross-exchange premium (compare_crypto_exchanges). This tells an agent exactly when to select this tool over alternatives.

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

get_dart_filingsKorean Disclosure Filings (DART)A
Read-only
Inspect

List corporate disclosure filings from DART, optionally filtered by company, date range, and disclosure type. Report names are in Korean.

Args:

  • corp: optional — Company: Korean name (e.g. '삼성전자'), 6-digit stock code (e.g. '005930'), or 8-digit DART corp_code (e.g. '00126380'). Omit for a market-wide list.

  • from / to: YYYY-MM-DD (default: last 90 days)

  • type: DART pblntf_ty — A=periodic reports(정기공시), B=major events(주요사항보고), C=securities issuance(발행공시), D=ownership/stake(지분공시), E=other(기타공시), F=external audit(외부감사관련), G=funds(펀드공시), H=asset securitization(자산유동화), I=KRX disclosures(거래소공시), J=fair trade(공정위공시)

  • limit: results per page, 1-100 (default 20); page: page number (default 1)

Returns: {total, page, filings: [{rcept_no, corp_name, report_nm, flr_nm, rcept_dt, url}]} — url opens the filing in the DART viewer (https://dart.fss.or.kr/dsaf001/main.do?rcpNo=...). The filing body is NOT fetched; follow the url separately if needed.

Examples:

  • {corp: '삼성전자'} -> Samsung filings in the last 90 days

  • {type: 'A', from: '2026-03-01', to: '2026-03-31'} -> March periodic reports market-wide

Use to track what a company disclosed. For major events with keyword filtering use get_dart_major_events. Errors: no filings in range (DART status 013) -> widen dates or drop filters; unknown company -> search_dart_company.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoEnd date YYYY-MM-DD (default: today)
corpNoOptional filter — Company: Korean name (e.g. '삼성전자'), 6-digit stock code (e.g. '005930'), or 8-digit DART corp_code (e.g. '00126380')
fromNoStart date YYYY-MM-DD (default: 90 days ago)
pageNoPage number (default 1)
typeNoDisclosure type: A=periodic, B=major events, C=issuance, D=ownership, E=other, F=audit, G=funds, H=asset-backed, I=KRX, J=fair-trade
limitNoResults per page, 1-100 (default 20)

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageNo
totalNo
filingsYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint: true, so the description's 'List' wording is consistent. The description adds valuable behavioral context beyond annotations: report names are in Korean, the filing body is NOT fetched and must be accessed via the returned URL, and the output includes pagination fields. It also discloses default date ranges and error behaviors.

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 well-organized with clear sections (main statement, Args, Returns, Examples, Use/alternative, Errors) and front-loads the core purpose. It is slightly verbose because some parameter details duplicate the input schema, but each section earns its place by providing examples, error guidance, and behavioral caveats.

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 the tool's complexity (6 optional parameters, Korean filing types, pagination, and a specific output shape), the description is remarkably complete. It covers the return structure, the need to follow the URL separately, defaults, examples, and error handling, leaving no significant information gap for an agent to call it 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 description coverage is 100%, so the baseline is 3. The description goes beyond the schema by adding Korean translations for each disclosure type, the original DART pblntf_ty naming, and concrete examples for the corp parameter (e.g., '삼성전자', '005930'). It also clarifies defaults for date range and page/limit behavior, which adds meaningful semantics.

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 opens with a specific verb and resource: 'List corporate disclosure filings from DART', making the tool's purpose immediately clear. It also differentiates from siblings by explicitly naming get_dart_major_events and by listing the types of filings, so an agent can distinguish it from get_dart_financials or get_dart_insider_trades.

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?

It provides direct usage guidance: 'Use to track what a company disclosed' and explicitly routes keyword-filtered major events to get_dart_major_events. It also gives error-handling instructions (widen dates or drop filters for status 013; use search_dart_company for unknown companies), which clarifies when and how to adapt.

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

get_dart_financialsKorean Company Financials (DART)A
Read-only
Inspect

Fetch financial statements of a Korean company from OpenDART (fnlttSinglAcntAll: full single-company statements) and normalize them to standard metrics. Amounts are raw KRW (no scaling); EPS is KRW per share.

Args:

  • corp: Company: Korean name (e.g. '삼성전자'), 6-digit stock code (e.g. '005930'), or 8-digit DART corp_code (e.g. '00126380')

  • year: business year 2015-2026 (default: last year). Annual reports are filed ~March of the following year (FY2025 filed 2026-03).

  • report: 'annual' | 'q1' | 'half' | 'q3' (default 'annual')

  • fs: 'consolidated' | 'separate' (default 'consolidated'). If consolidated statements do not exist, automatically retries separate and says so in notes.

  • response_format: 'markdown' (default, tables) or 'json' (compact)

Returns structured {normalized, accounts}:

  • normalized: {company:{name,id,ticker}, basis, periods:[{period, fiscal_year, currency:'KRW', metrics:{revenue, gross_profit, operating_income, net_income, eps_diluted, assets, liabilities, equity, cash_and_equivalents, operating_cash_flow}}], notes}. Annual reports include the prior-year comparative as a second period.

  • accounts: top ~40 raw statement rows [{sj_div (BS/IS/CIS/CF/SCE), account_nm, account_id, thstrm, frmtrm}].

Examples:

  • {corp: '삼성전자', year: 2024} -> FY2024+FY2023, revenue ~3.0e14 KRW

  • {corp: '005930', year: 2025, report: 'q1'} -> Q1 2025 (3-month income-statement figures)

Use for KR-listed company fundamentals. Don't use for US companies (get_edgar_financials) or for filings text (get_dart_filings). Errors: 'no data' (DART status 013) -> try another year/report or fs='separate'; unknown company -> run search_dart_company first.

ParametersJSON Schema
NameRequiredDescriptionDefault
fsNoStatement scope: consolidated(연결, CFS) or separate(별도, OFS). Default consolidated.consolidated
corpYesCompany: Korean name (e.g. '삼성전자'), 6-digit stock code (e.g. '005930'), or 8-digit DART corp_code (e.g. '00126380')
yearNoBusiness year (bsns_year), 2015-2026. Default: last year (2025).
reportNoReport type: annual(사업보고서) | q1(1분기) | half(반기) | q3(3분기). Default annual.annual
response_formatNo'markdown' for tables, 'json' for compact machine-readable outputmarkdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
accountsNo
normalizedYes

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses meaningful behavior: raw KRW amounts, EPS units, automatic fallback to separate statements, prior-year comparatives in annual reports, and exact error conditions. This gives the agent an accurate picture of side effects and edge cases.

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 front-loaded with a clear one-sentence purpose, then organized into Args, Returns, Examples, usage, and Errors sections. It is long, and some Args text duplicates the schema, but for a 5-parameter tool with complex return shape and error behavior, the structure keeps it navigable.

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 the data source, units, normalization, return structure, defaults, fallback behavior, error codes, and sibling-tool boundaries. With an output schema present and annotations already signaling read-only behavior, nothing material is missing for correct invocation.

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 the baseline is 3. The description adds incremental meaning: filing timing for the year parameter, automatic fs retry behavior, the 3-month nature of Q1 figures, and concrete example corp identifiers. This lifts it above baseline without being maximally additive.

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?

States a specific verb and resource: 'Fetch financial statements of a Korean company from OpenDART' and normalize them to standard metrics. This makes the tool's role unmistakable and distinguishes it from sibling tools like get_edgar_financials and get_dart_filings.

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 'Use for KR-listed company fundamentals. Don't use for US companies (get_edgar_financials) or for filings text (get_dart_filings).' It also tells the agent to run search_dart_company for unknown companies and how to recover from the 'no data' error. This is model routing guidance.

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

get_dart_insider_tradesGet KR Insider Trades (DART 임원·주요주주 소유보고)A
Read-only
Inspect

Korean insider transactions for a listed KR company, from DART's 임원ㆍ주요주주 특정증권등 소유상황보고서 (elestock) — the Korean equivalent of SEC Form 4. Includes a buy-vs-sell summary and an optional buy/sell filter.

Buy vs sell is the SIGN of the reported share change (증감수): positive = 취득 (acquire / buy), negative = 처분 (dispose / sell). Insider BUYING is a stronger sentiment signal.

Args:

  • company (required): KR 6-digit stock code (e.g. '005930'), company name, or 8-digit DART corp_code

  • limit: number of most-recent reports to return, 1-100 (default 20)

  • tx_type: 'all' (default) | 'buy' (share change > 0) | 'sell' (share change < 0)

  • response_format: 'markdown' (default) or 'json'

Returns: {company:{corp_code, corp_name}, tx_type, summary:{buys:{count,shares}, sells:{count,shares}}, count, trades:[{filedAt, reporter, position, registered_exec, major_shareholder, change, shares_after, change_rate}], notes}. summary totals cover the whole fetched set regardless of the filter.

Important: unlike US Form 4, the KR report has NO transaction price — only share counts (no value). Reports are filed within ~5 business days.

Examples:

  • "삼성전자 임원 매수" -> {company:'005930', tx_type:'buy'}

  • "SK하이닉스 내부자 매도 최근" -> {company:'000660', tx_type:'sell'}

Use when: monitoring KR officer / major-shareholder buy/sell activity. For US insiders use get_edgar_insider_trades. For institutional holdings use get_edgar_13f. Errors: unknown company -> use search_dart_company; a filter with no matches returns count 0 (not an error).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of most-recent reports (default 20)
companyYesKR 6-digit stock code (e.g. '005930'), company name, or DART corp_code
tx_typeNo'all' (default), 'buy' = acquisitions (change > 0), 'sell' = disposals (change < 0)all
response_formatNo'markdown' for a table, 'json' for compact machine-readable outputmarkdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
notesNo
tradesYes
companyYes
summaryNo
tx_typeNo

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already mark the tool read-only, and the description builds on this by adding key behavioral facts: buy/sell is defined by the sign of the share change, KR reports contain no transaction price, filings are delayed ~5 business days, and summary totals cover the entire fetched set regardless of filter. This goes well beyond the annotations and schema.

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 long but densely informative, with every section earning its place: source, sign semantics, args, return structure, limitations, examples, routing, and error handling. It is front-loaded with purpose and a clear definition of buy/sell, then uses structured sections for details.

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?

Even with a rich output schema present, the description includes the return structure, filter semantics, examples, known limitations (no price, filing lag), and error paths. An agent has everything needed to select, invoke, and interpret this tool correctly without additional context.

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?

The schema already documents all parameters at 100% coverage, so the baseline is 3. The description adds extra value by explaining the sign convention behind tx_type, providing concrete examples for company resolution, and emphasizing the sentiment meaning of insider buying. This lifts it above baseline, though it does repeat some schema content.

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 states a specific action ('get insider transactions for a listed KR company'), identifies the exact source ('DART elestock'), and explicitly aligns it with SEC Form 4. It names sibling tools for US insiders and institutional holdings, so the tool is clearly differentiated from get_edgar_insider_trades and get_edgar_13f.

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 provides explicit 'Use when' guidance, names the alternative for US insiders, and explains that unknown companies should be resolved via search_dart_company. It also clarifies that a filter with no matches returns count 0, not an error, which prevents incorrect error handling.

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

get_dart_major_eventsKorean Major-Event Disclosures (DART)A
Read-only
Inspect

List major-event disclosures (주요사항보고서, DART type B): capital increases, mergers, convertible bonds, treasury stock, bankruptcy, lawsuits, etc. Optionally filter report names with a regex.

Args:

  • corp: optional — Company: Korean name (e.g. '삼성전자'), 6-digit stock code (e.g. '005930'), or 8-digit DART corp_code (e.g. '00126380'). Omit for market-wide events.

  • from / to: YYYY-MM-DD (default: last 180 days)

  • kinds: optional JavaScript regex matched against the Korean report name, e.g. '증자|합병|전환사채' (capital increase | merger | CB) or '자기주식' (treasury stock). Filtering is applied client-side over the most recent 100 events in range.

  • limit: max results, 1-100 (default 20)

Returns: {total, page, filings: [{rcept_no, corp_name, report_nm, flr_nm, rcept_dt, url}]} — same shape as get_dart_filings. When kinds is given, total = matched count within the scanned window.

Examples:

  • {corp: '삼성전자', kinds: '자기주식'} -> Samsung treasury-stock decisions in the last 180 days

  • {kinds: '유상증자', from: '2026-01-01', to: '2026-06-30'} -> market-wide rights offerings in H1 2026

Use for event-driven screening. For all filing categories use get_dart_filings. Errors: no events in range (DART status 013) -> widen dates; invalid kinds regex; unknown company -> search_dart_company.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoEnd date YYYY-MM-DD (default: today)
corpNoOptional filter — Company: Korean name (e.g. '삼성전자'), 6-digit stock code (e.g. '005930'), or 8-digit DART corp_code (e.g. '00126380')
fromNoStart date YYYY-MM-DD (default: 180 days ago)
kindsNoRegex filter on Korean report names, e.g. '증자|합병|전환사채' or '자기주식'
limitNoMax results, 1-100 (default 20)

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageNo
totalNo
filingsYes

TDQS

A5/5.0
Behavior5/5

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

Even though annotations already mark the tool as read-only and open-world, the description adds substantial behavioral detail: client-side filtering over the most recent 100 events, default date range of 180 days, how total is computed when kinds is supplied, and specific DART error status handling. No contradiction exists between the description and 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?

The description is well-structured with Args, Returns, Examples, Use, and Errors sections, and every sentence carries decision-relevant information. The main purpose is front-loaded, and the length is justified by the density of useful detail rather than fluff.

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?

The description covers filtering scope, defaults, client-side behavior, return shape, error conditions, and sibling tool routing. Since an output schema exists, not repeating return value details is acceptable; the description is complete for a read-only filtered retrieval tool.

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 description coverage is 100%, and the description still adds meaningful semantics beyond the schema: accepted corp formats plus omitting it for market-wide events, JavaScript regex behavior applied client-side, the 100-event scanning window, and illustrative examples for kinds. This materially helps an agent choose and format arguments correctly.

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 opens with a specific verb and resource: 'List major-event disclosures (주요사항보고서, DART type B)' and enumerates concrete event categories such as capital increases, mergers, and treasury stock. It also differentiates itself from get_dart_filings by scoping this tool to major events rather than all filing categories.

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 this tool: 'Use for event-driven screening.' It also names the alternative, get_dart_filings, for all filing categories, and the error section routes unknown companies to search_dart_company. The examples clarify both company-specific and market-wide use cases.

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

get_db_schemaFinBridge DB SchemaA
Read-only
Inspect

Inspect the schema of the local finbridge database (SQLite with ingested KR/US company fundamentals, filings, and daily prices): tables, views, columns, per-table row counts (cached 5 minutes), and ready-to-run example queries for query_db.

Args: (none)

Returns: {tables: [{name, columns: [{name, type}], rows}], views: [{name, columns: [{name, type}]}], examples: [sql_string]}

Key objects:

  • companies: KR companies have source='dart' + stock_code (6-digit), US companies source='edgar' + ticker

  • financials: one row per company x fiscal_year x quarter (quarter=0 = annual); raw unscaled KRW/USD amounts

  • prices_daily: daily OHLCV per company_id

  • views v_financials (financials joined with company name/ticker/stock_code) and v_latest_annual (latest annual row per company) — prefer these in query_db

Examples:

  • Call before writing SQL for query_db, to learn table/column names.

  • Check row counts to see how much data the nightly ingest has loaded.

Use when: preparing a query_db, or checking ingest coverage. Don't use for live market data (use the dart_/edgar_/fred_/crypto_ tools). Errors: 'database has not been built yet' — the ingest pipeline has not run on the server.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
viewsYes
tablesYes
examplesNo

TDQS

A4.9/5.0
Behavior5/5

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

Even with readOnlyHint=true already in annotations, the description adds meaningful behavioral context: row counts are 'cached 5 minutes', the database is a local SQLite store, and the error 'database has not been built yet' is explained as the ingest pipeline not having run. This goes well beyond the annotation and prepares the agent for real-world behavior.

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 long but tightly organized with clear sections (Args, Returns, Key objects, Examples, Use when, Errors). Every section earns its place: the schema details in 'Key objects' are essential for understanding the database, and the error note prevents confusion. It is front-loaded with the core purpose.

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 the complexity of a database schema tool, the description is remarkably complete: it explains key tables and fields, identifies the preferred views, provides example usage, and covers failure modes. The presence of an output schema further reduces the need to explain return values, but the description already does so.

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?

The tool has zero parameters, and the description explicitly states 'Args: (none)', eliminating ambiguity. Per the baseline for zero-parameter tools, this is a 4. The return-value breakdown is also present, helping the agent understand how the tool's output will be structured.

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 states a specific verb ('Inspect') and resource ('schema of the local finbridge database') and enumerates exactly what is returned: tables, views, columns, row counts, example queries. It clearly distinguishes itself from siblings by explicitly disclaiming live market data and pointing to query_db, making it easy to tell apart.

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 provides explicit usage conditions: 'Use when: preparing a query_db, or checking ingest coverage.' It also gives a direct exclusion: 'Don't use for live market data (use the dart_/edgar_/fred_/crypto_ tools).' This is exemplary when/when-not guidance.

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

get_disclosure_feedDisclosure Feed (FinBridge DB)A
Read-only
Inspect

Recent regulatory disclosures from the local finbridge database (filings table, refreshed nightly + intraday for KR), newest first — positioned as a faster-than-news primary source. By default returns only MATERIAL filings: US Form 8-K (current reports) and KR 주요사항보고서 (major events: capital raises, M&A, convertible bonds, buybacks, etc.).

Args:

  • market: 'kr' (DART), 'us' (EDGAR), or 'all' (default)

  • company: optional — restrict to one company (US ticker, KR 6-digit code, or name)

  • material_only: default true (8-K / KR type-B only); false = all filing types

  • forms: optional explicit form_type filter (e.g. ['10-K','8-K'] or ['A','B']); overrides material_only

  • days: look-back window in days, 1-120 (default 14); or use from/to

  • from/to: optional explicit YYYY-MM-DD range (overrides days)

  • limit: 1-100 (default 30); response_format: 'markdown'|'json'

Returns: {count, market, since, rows:[{source, company_name, form_type, title, filed_date, url, items?}]}. 'items' (8-K item codes) is included when available.

Examples:

  • Latest US material events this week: {market:'us', days:7}

  • Samsung's recent major-event filings: {company:'005930', material_only:true, days:90}

  • All of a company's filings: {company:'AAPL', material_only:false}

Use when: scanning for catalysts / breaking corporate events, or one company's recent filings. Don't use for filing BODIES (open the url) or for financial statement values (get_dart_financials / get_edgar_financials / query_db). Notes: Filing metadata only; bodies are at the linked source URLs. Not investment advice. Errors: empty result is not an error (count 0).

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoExplicit end date YYYY-MM-DD
daysNoLook-back window in days (default 14)
fromNoExplicit start date YYYY-MM-DD (overrides days)
formsNoExplicit form_type filter; overrides material_only
limitNoMax rows (default 30)
marketNoMarket: 'kr', 'us', or 'all' (default)all
companyNoOptional company filter: US ticker, KR 6-digit code, or name
material_onlyNoOnly material filings (US 8-K / KR type-B). Default true
response_formatNo'markdown' or 'json'markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
rowsYes
countYes
sinceNo
marketNo
companyNo

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, so the description needn't restate that; instead it adds valuable behavioral context: refresh cadence ('nightly + intraday for KR'), materiality defaults, override chains (forms overrides material_only, from/to overrides days), return shape, and 'empty result is not an error (count 0)'. It also notes metadata-only content and link to source URLs, which is more than the annotations carry.

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 long but well-structured, front-loading the core purpose before the Args list, and each section (Returns, Examples, Use when, Notices) earns its place. The only minor deduction is rhetorical filler like 'positioned as a faster-than-news primary source' and boilerplate 'Not investment advice', which are not strictly needed.

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?

For a tool with 9 parameters, an output schema, and many siblings, the description covers everything needed to invoke it correctly: argument semantics, defaults, overrides, return fields, examples, error behavior, and explicit routing guidance. It is hard to imagine an agent being confused after reading it.

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?

Although schema coverage is 100%, the description enriches the params meaningfully: market maps 'kr' to DART and 'us' to EDGAR; material_only defines what counts as material (8-K / KR type-B); forms gives examples ['10-K','8-K'] / ['A','B']; from/to and days behavior with override semantics are made explicit. The usage examples tie params to real use cases.

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 opens with 'Recent regulatory disclosures from the local finbridge database' and immediately narrows to the filings table with a specific default scope (material filings: US 8-K and KR 주요사항보고서). This clearly distinguishes it from siblings like get_dart_filings/get_edgar_filings, and the 'Don't use for filing BODIES' phrase further differentiates it.

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?

It has an explicit 'Use when' section naming catalyst scanning and single-company filing review, plus explicit 'Don't use for' exclusions pointing to alternatives (get_dart_financials, get_edgar_financials, query_db). This tells an agent exactly when to pick this tool vs. others.

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

get_edgar_13fGet Institutional Holdings (SEC Form 13F)A
Read-only
Inspect

Latest institutional-manager holdings from a SEC Form 13F-HR filing, aggregated by security with quarter-over-quarter (QoQ) changes. Filer-centric: answers "what does hold?" for a named institutional investment manager (e.g. Berkshire Hathaway, Bridgewater). It does NOT answer "who owns ?" — 13F info tables key securities by CUSIP + issuer name, not ticker.

Args:

  • filer (required): institutional manager NAME ('Berkshire Hathaway Inc', 'Bridgewater Associates') or CIK number ('1067983'). NOTE: 13F managers are not in the ticker map, so an issuer ticker (AAPL) will not resolve here — use the manager's name or CIK.

  • top: number of largest holdings (by value) to return, 1-50 (default 20). QoQ changes are likewise capped at this count, most material first.

  • response_format: 'markdown' (default) or 'json'

Returns: {filer:{name, cik}, period (YYYY-MM-DD quarter end), filed, total_value (whole USD), num_holdings (distinct CUSIPs), value_unit:'USD', holdings:[{issuer, cusip, class, shares, value, pct_of_portfolio}], prior_period?, changes:[{issuer, cusip, action, delta_shares, new_shares, prior_shares}], notes}. action: new=opened, added=increased, reduced=trimmed, sold=fully exited. Multiple info-table rows per issuer (one per sub-manager) are summed by CUSIP.

Examples:

  • "What does Berkshire hold?" -> {filer:'Berkshire Hathaway Inc'}

  • "Bridgewater's top 10 positions and QoQ moves" -> {filer:'Bridgewater Associates', top:10}

  • "Berkshire 13F by CIK" -> {filer:'1067983'}

Use when: you want a specific institutional manager's disclosed US equity portfolio and how it changed since the prior quarter. Don't use for: insider trades (get_edgar_insider_trades / Form 4), a reverse "which funds own ticker X" view (not supported — CUSIPs are not mapped to this server's ticker universe), Korean holdings, or intra-quarter/real-time positions.

Caveats: value is reported in whole USD for filings on/after 2023-01-03 and in thousands before (normalized here to whole USD; a note flags conversions). 13F covers only long US-listed 13(f) securities — no shorts, options detail, cash, or non-US holdings — and is filed up to 45 days after quarter-end. Not investment advice.

Errors: unknown filer -> ToolError (only 13F filers covered; use the exact name or CIK); ambiguous name -> ToolError listing candidate managers with CIKs; a manager filing 13F-NT only -> ToolError explaining no holdings table exists.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoNumber of largest holdings by value to return (default 20)
filerYesInstitutional manager name ('Berkshire Hathaway Inc', 'Bridgewater Associates') or CIK number ('1067983')
response_formatNo'markdown' for tables, 'json' for compact machine-readable outputmarkdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
filedNo
filerYes
notesNo
periodNo
changesYes
holdingsYes
value_unitNo
total_valueNo
num_holdingsNo
prior_periodNo

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already mark this read-only and open-world, and the description adds substantial behavioral context: CUSIP-level aggregation/summing, 45-day filing lag, value normalization from thousands to whole USD, coverage limits (long US-listed 13(f) securities only), and specific ToolError cases. No contradiction 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.

Conciseness4/5

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

The description is long but logically structured into labeled sections (Args, Returns, Examples, Use when, Don't use, Caveats, Errors), making it easy for an agent to scan. The only minor issue is some repetition of the ticker-resolution warning, though it is defensible emphasis for a common failure mode.

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?

For a tool with one required parameter, rich annotations, and an output schema, the description covers invocation, parameter semantics, examples, failure modes, and data caveats comprehensively. Nothing an agent needs to decide whether to call it correctly is missing.

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 coverage is 100%, and the description still adds real value: filer gets examples plus the critical caveat that issuer tickers will not resolve; top gets its 1-50 range and the behavior of capping QoQ changes; response_format gets clarity on markdown vs json. This far exceeds the 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 opens with a specific verb and resource: 'Latest institutional-manager holdings from a SEC Form 13F-HR filing, aggregated by security with quarter-over-quarter changes.' It also explicitly distinguishes the tool's filer-centric scope from a reverse 'who owns <ticker>?' lookup, clearly separating it from sibling EDGAR tools.

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 'Use when' and 'Don't use for' sections, including a direct pointer to get_edgar_insider_trades / Form 4 as the alternative for insider trades. It also lists concrete exclusions (Korean holdings, intra-quarter/real-time positions) and notes the unsupported reverse lookup.

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

get_edgar_filingsList SEC FilingsA
Read-only
Inspect

List a US company's recent SEC filings (10-K, 10-Q, 8-K, S-1, proxy statements, Form 4, ...) from the EDGAR submissions index. Returns metadata and document URLs only — it does NOT download filing contents; fetch the returned url yourself for the document text.

Args:

  • company (required): ticker / company name / CIK

  • forms: optional form-type filter, e.g. ['10-K'] or ['10-K','10-Q','8-K'] (exact match, case-insensitive)

  • from / to: optional YYYY-MM-DD filing-date range

  • limit: max rows, 1-50 (default 20)

Returns: {company:{cik, name, ticker}, count, filings:[{form, filingDate, accessionNumber, primaryDocument, items?, url}], notes?}. 8-K rows include 'items' (e.g. '2.02,9.01' = results of operations + exhibits). Coverage = the latest ~1000 filings per company.

Examples:

  • "Apple's latest annual report" -> {company:'AAPL', forms:['10-K'], limit:1} then fetch the url

  • "Tesla 8-Ks this year" -> {company:'TSLA', forms:['8-K'], from:'2026-01-01'}

Use when: you need filing dates, document links, or 8-K event items for a US company. Don't use for: Korean disclosures (get_dart_filings) or filing full-text search across all companies.

Errors: unknown company -> use search_edgar_company; an empty result usually means the form/date filter is too narrow for the ~1000-filing window.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoLatest filing date, YYYY-MM-DD
fromNoEarliest filing date, YYYY-MM-DD
formsNoForm types to include, e.g. ['10-K','8-K']. Omit for all forms
limitNoMax filings to return (default 20)
companyYesUS company: ticker (e.g. 'AAPL', 'BRK-B' or 'BRK.B'), company name, or CIK number

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
notesNo
companyYes
filingsYes

TDQS

A4.7/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=true and openWorldHint=true, and the description reinforces this by stating it does NOT download filing contents and that the caller must fetch the returned URL. It also discloses meaningful behavior beyond the schema: exact-match case-insensitive form filtering, a ~1000-filing window, and 8-K items. These details add real value.

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 well-structured with labeled sections (Args, Returns, Use when, Don't use, Errors) and front-loads the most important behavioral constraint—no content download—immediately. Examples and error guidance justify the length; no sentence is wasted.

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?

For a read-only list tool with a rich output schema, the description covers the return shape, parameter constraints, usage boundaries, and error recovery. It is complete enough for an agent to call the tool correctly and interpret results without additional inference.

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 the baseline is 3, but the description adds useful semantics beyond the schema: the exact-match and case-insensitive nature of forms, the ~1000-filing window implication, and the practical interpretation of company as ticker/name/CIK with examples like 'BRK-B' or 'BRK.B'. This lifts it above 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 opens with a specific verb and resource: 'List a US company's recent SEC filings' from the EDGAR submissions index. It clearly distinguishes itself from sibling tools by stating it returns metadata and document URLs only, not contents, and by naming Korean disclosures and full-text search as exclusions.

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?

Explicit 'Use when' and 'Don't use for' sections name the exact conditions and alternatives, including get_dart_filings for Korean disclosures and full-text search for all companies. It also gives error guidance to use search_edgar_company for unknown companies, which fully routes the agent to the correct tool.

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

get_edgar_financialsGet US Company Financials (SEC XBRL)A
Read-only
Inspect

Normalized annual (10-K) or quarterly (10-Q) financial statements for a US company, from SEC EDGAR XBRL company facts (US-GAAP). Values are raw USD (not scaled); eps_diluted is USD per share.

Args:

  • company (required): ticker / company name / CIK (e.g. 'AAPL', 'Microsoft', '789019')

  • freq: 'annual' (default, from 10-K) or 'quarterly' (discrete Q1-Q3 from 10-Qs; Q4 is not reported separately)

  • periods: how many most-recent periods, 1-12 (default 3)

  • metrics: optional subset of [revenue, gross_profit, operating_income, net_income, eps_diluted, assets, liabilities, equity, cash_and_equivalents, operating_cash_flow] (default all)

  • response_format: 'markdown' (default) or 'json'

Returns NormalizedFinancials: {company:{name, id(CIK), ticker}, basis:'US-GAAP (10-K)', periods:[{period:'FY2024', fiscal_year, end, currency:'USD', metrics:{revenue, net_income, ...}}], notes}. periods are most-recent first; fiscal_year = calendar year of the period end date.

Examples:

  • "Apple's revenue and net income for the last 3 years" -> {company:'AAPL', metrics:['revenue','net_income']}

  • "MSFT last 4 quarters" -> {company:'MSFT', freq:'quarterly', periods:4}

Use when: you need US-GAAP fundamentals for a US-listed company. Don't use for: Korean companies (get_dart_financials), stock prices, or IFRS 20-F foreign private issuers (not supported).

Errors: unknown company -> use search_edgar_company first; companies without us-gaap XBRL facts (funds, 20-F filers) return an error explaining why.

ParametersJSON Schema
NameRequiredDescriptionDefault
freqNo'annual' = fiscal years from 10-K filings; 'quarterly' = discrete Q1-Q3 from 10-Q filingsannual
companyYesUS company: ticker (e.g. 'AAPL', 'BRK-B' or 'BRK.B'), company name, or CIK number
metricsNoOptional metric subset. Available: revenue, gross_profit, operating_income, net_income, eps_diluted, assets, liabilities, equity, cash_and_equivalents, operating_cash_flow. Default: all
periodsNoNumber of most-recent periods (default 3)
response_formatNo'markdown' for a table, 'json' for compact machine-readable outputmarkdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
basisNo
companyYes
periodsYes

TDQS

A4.8/5.0
Behavior5/5

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

The description goes well beyond the readOnlyHint annotation by disclosing that values are raw USD, eps_diluted is per share, Q4 is not reported separately, periods are most-recent first, and fiscal_year equals the calendar year of the period end date. It also documents error behavior for unknown companies and unsupported filers, adding substantial behavioral context 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.

Conciseness4/5

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

The description is well-structured with clear sections: summary, Args, Returns, Examples, Use when, and Errors. It is longer than necessary because the Args section repeats schema information, but every section serves a distinct purpose and the critical usage guidance is front-loaded.

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?

The description is complete for a read-only financial data tool: it covers input semantics, output shape, edge cases (Q4 missing, foreign issuers, unknown companies), alternative tools, and usage contexts. The output schema is also summarized in the Returns section, so an agent has enough information to invoke and interpret the tool 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 the baseline is 3. The description adds value through concrete examples (e.g., 'AAPL', 'Microsoft', '789019'), clarifications like discrete Q1-Q3 from 10-Qs, and a natural-language mapping example. There is some duplication of schema descriptions in the Args block, but the additions improve 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 states a specific verb and resource: it 'Normalized annual (10-K) or quarterly (10-Q) financial statements for a US company, from SEC EDGAR XBRL company facts (US-GAAP).' It clearly distinguishes itself from siblings like get_dart_financials and get_stock_prices by specifying US-GAAP fundamentals from SEC filings.

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 says 'Use when: you need US-GAAP fundamentals for a US-listed company' and 'Don't use for: Korean companies (get_dart_financials), stock prices, or IFRS 20-F foreign private issuers (not supported).' This names alternatives and exclusion conditions, giving an agent clear routing guidance.

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

get_edgar_insider_tradesGet Insider Trades (SEC Form 4)A
Read-only
Inspect

Latest insider transactions for a US company, parsed from SEC Form 4 filings, with a buy-vs-sell summary and an optional buy/sell filter. Each trade lists the reporting insider, their relationship, and non-derivative (common stock) transactions.

Insider BUYS (open-market purchases, code P) are a stronger sentiment signal than sells (code S), which happen for many reasons (diversification, taxes). Use tx_type to monitor one side.

Args:

  • company (required): ticker / company name / CIK

  • limit: number of most-recent Form 4 filings to parse, 1-25 (default 10)

  • tx_type: 'all' (default) | 'buy' (code P purchases only) | 'sell' (code S sales only)

Returns: {company:{cik, name, ticker}, tx_type, summary:{buys:{count,shares,value}, sells:{count,shares,value}}, count, trades:[{filedAt, owner, relationship, url, transactions:[{date, code, shares, price_per_share, acquired_or_disposed, shares_owned_after}]}], notes}. summary totals cover the whole fetched window regardless of the filter; value = shares x price where a price is reported. Transaction codes: P=open-market purchase, S=open-market sale, M=option exercise, F=shares withheld for tax, A=award/grant, G=gift. acquired_or_disposed: A=acquired, D=disposed.

Examples:

  • "insider BUYING at Apple" -> {company:'AAPL', tx_type:'buy'}

  • "recent insider SELLING at Nvidia" -> {company:'NVDA', tx_type:'sell'}

  • "all TSLA insider activity, more history" -> {company:'TSLA', limit:25}

Use when: monitoring insider buy/sell activity (officers, directors, 10% owners) for a US-listed company. Larger 'limit' widens the time window. Don't use for: institutional holdings (use get_edgar_13f), Korean companies, or derivative-only detail (option grids are skipped).

Errors: unknown company -> use search_edgar_company; a filter with no matching transactions returns count 0 (not an error); unparseable Form 4 XMLs are skipped and counted in notes.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of most-recent Form 4 filings to parse (default 10)
companyYesUS company: ticker (e.g. 'AAPL', 'BRK-B' or 'BRK.B'), company name, or CIK number
tx_typeNo'all' (default), 'buy' = open-market purchases (code P) only, 'sell' = sales (code S) onlyall

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
notesNo
tradesYes
companyYes
summaryNo
tx_typeNo

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses important behavioral details: summary totals cover the full window regardless of filter, value is calculated as shares x price, unparseable XMLs are skipped and counted in notes, and empty filtered results return count 0 rather than error. This is rich, non-obvious behavior that agents need.

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 long but every section earns its place: purpose, args, return shape, transaction codes, examples, use/don't-use, and error behavior. The structure is front-loaded with the core purpose and uses compact labeled sections for quick scanning.

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?

For a complex SEC-filings tool with three parameters, an output schema, and multiple sibling tools, the description covers all critical contexts: company identification formats, filtering semantics, edge cases, error handling, and exclusions. Nothing essential is left for the agent to infer.

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 the baseline is 3, but the description adds real value: it explains the meaning of transaction codes (P, S, M, F, A, G), clarifies that summary aggregates span the whole window despite tx_type filtering, and provides example inputs like 'AAPL' and 'NVDA'. This goes beyond the schema's field-level descriptions.

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 opens with a specific verb and resource: 'Latest insider transactions for a US company, parsed from SEC Form 4 filings' plus a buy-vs-sell summary and filter. It clearly identifies the SEC Form 4 domain, distinguishes itself from DART-based insider trades, and explicitly says 'Don't use for: ... Korean companies'.

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 provides explicit when-to-use ('monitoring insider buy/sell activity... for a US-listed company') and when-not-to-use guidance, naming the sibling alternative 'get_edgar_13f' for institutional holdings. It also gives concrete query examples mapping natural language to parameters.

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

get_fred_seriesGet FRED Series ObservationsA
Read-only
Inspect

Fetch observations (time series data points) for a FRED series, with optional date range, frequency aggregation, and unit transformation.

Args:

  • series_id: FRED series ID, e.g. 'CPIAUCSL', 'UNRATE', 'DGS10', 'DEXKOUS' (case-insensitive)

  • from / to: YYYY-MM-DD observation range (optional)

  • frequency: aggregate to d/w/m/q/a (optional; FRED averages within the period; cannot be finer than the native frequency)

  • units: lin (levels, default) | chg (change) | pch (% change) | pc1 (% change from year ago) | log (natural log)

  • limit: 1-1000 (default 120). Without from/to this returns the LATEST N observations; with a range, the latest N within the range.

  • response_format: 'markdown' (default) or 'json'

Returns: {series:{id,title,units,frequency,last_updated}, observations:[{date, value}], source}. Observations are ascending by date; value is null where FRED reports '.'.

Examples:

  • "US 10Y treasury yield, last 30 points" -> {series_id:'DGS10', limit:30}

  • "CPI YoY inflation since 2020" -> {series_id:'CPIAUCSL', units:'pc1', from:'2020-01-01'}

  • "annual average USD/KRW 2023-2025" -> {series_id:'DEXKOUS', from:'2023-01-01', to:'2025-12-31', frequency:'a'}

  • Don't use for series discovery — use search_fred_series first.

Errors: unknown series_id suggests search_fred_series; invalid frequency/range combinations explain the constraint; missing FRED_API_KEY returns a hint to obtain a free key.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoObservation end date YYYY-MM-DD (optional)
fromNoObservation start date YYYY-MM-DD (optional)
limitNoMax observations, latest first-served (default 120)
unitsNoTransformation: lin=levels (default), chg=change, pch=% change, pc1=% change from year ago, log=natural loglin
frequencyNoAggregate to daily/weekly/monthly/quarterly/annual (FRED period average). Optional.
series_idYesFRED series ID, e.g. 'CPIAUCSL' (case-insensitive)
response_formatNo'markdown' for a table, 'json' for compact machine-readable outputmarkdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
seriesYes
sourceYes
observationsYes

TDQS

A5/5.0
Behavior5/5

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

Annotations already mark readOnlyHint=true and openWorldHint=true, and the description adds meaningful behavioral details: frequency aggregation 'cannot be finer than the native frequency', 'value is null where FRED reports .', the latest-N semantics of limit, and an API-key error hint. 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?

The description is long but every section earns its place: one-line purpose, parameter semantics, return shape, examples, and error guidance. It is clearly structured with labels, making it easy to scan, and the examples are high-value rather than filler.

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?

For a 7-parameter tool with one required parameter, this description fully equips an agent to invoke it correctly: it covers parameter combinations, return format, null handling, error behavior, and relationship to the FRED API key. Nothing necessary for correct invocation is missing.

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 coverage is 100%, but the description adds substantial value: frequency constraint versus native frequency, limit behavior in and out of a date range, unit transformation choices with examples, and realistic series IDs. The examples map entire user intents to parameter combinations, which goes far 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?

States a specific verb and resource: 'Fetch observations (time series data points) for a FRED series', with optional modifiers. It clearly distinguishes from series discovery by saying 'Don't use for series discovery — use search_fred_series first', and the examples reinforce the observation-fetching purpose.

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 tells the agent when not to use it ('Don't use for series discovery — use search_fred_series first') and gives four concrete natural-language-to-parameter examples. It also explains the behavior of limit with and without a date range, which is exactly the kind of usage nuance an agent needs.

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

get_fred_snapshotGet US Macro Snapshot (FRED)A
Read-only
Inspect

Fetch a predefined set of key US macro indicators from FRED in one call: latest value, previous value, and date for each series.

Args:

  • set: which indicator set (default us_core)

    • us_core: FEDFUNDS (Fed funds rate), DGS10, DGS2, T10Y2Y (10Y-2Y spread), CPIAUCSL (CPI YoY %), UNRATE, PAYEMS (monthly payroll change), DEXKOUS (KRW per USD)

    • rates: FEDFUNDS, DGS2, DGS10, DGS30, T10Y2Y, MORTGAGE30US, SOFR

    • inflation: CPIAUCSL, CPILFESL, PCEPI, PCEPILFE, PPIACO (all as % change from year ago)

    • labor: UNRATE, PAYEMS (change), ICSA (initial claims), CIVPART, AHETPI (wages YoY %)

Returns: {set, as_of, indicators:[{id, title, value, prev, date, units}], source}. 'value' is the latest non-null observation, 'prev' the one before it.

Examples:

  • "how does the US economy look right now" -> {set:'us_core'}

  • "current US rate complex" -> {set:'rates'}

  • Don't use for historical analysis or non-listed series — use get_fred_series instead.

Errors: individual unavailable series are reported in 'notes' without failing the whole snapshot; missing FRED_API_KEY returns a hint to obtain a free key.

ParametersJSON Schema
NameRequiredDescriptionDefault
setNoIndicator set: us_core (default) | rates | inflation | laborus_core

Output Schema

ParametersJSON Schema
NameRequiredDescription
setNo
as_ofNo
sourceYes
indicatorsYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already mark it read-only and open-world, and the description adds meaningful behavior: 'value' is the latest non-null observation with 'prev' being the one before it, partial failures degrade to 'notes' rather than failing the whole snapshot, and missing FRED_API_KEY surfaces a hint. This is more than the annotations alone 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 dense but well-organized into Args, Returns, Examples, and Errors, with the core purpose front-loaded. Every section contributes operational knowledge rather than restating the name or schema.

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?

For a one-parameter, read-only snapshot tool with an output schema, the description is complete: it defines the return shape, explains degraded behavior, names the alternative for historical/flexible queries, and covers the API-key prerequisite. Nothing essential is missing.

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% and the single set parameter already has an enum and default, so the baseline is 3; the description adds real value by itemizing exactly which indicators each set contains and clarifying transformations such as CPI YoY %. This makes choosing the correct set much easier.

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 opens with a specific verb and resource: 'Fetch a predefined set of key US macro indicators from FRED in one call' and enumerates exact series by set. It clearly distinguishes this snapshot tool from get_fred_series by emphasizing predefinition and single-call behavior.

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?

It provides explicit selection guidance: 'Don't use for historical analysis or non-listed series — use get_fred_series instead,' plus natural-language examples that map to set values. This tells an agent exactly when to invoke this tool versus its closest sibling.

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

get_peersPeer CompaniesA
Read-only
Inspect

Comparison set for one company across KR / US / TW / JP: the company plus its closest peers, chosen from the same industry group (SIC / KSIC / TWSE / EDINET classification, normalised to one shared bucket) and ranked by market-cap proximity with same-market names first. Falls back to pure size peers when the company has no classification. Also returns the company's business-segment revenue split where available (currently Japan, from 有価証券報告書 XBRL) — informational, not yet used for ranking.

Args:

  • company: US ticker ('AAPL'), KR 6-digit code ('005930'), TW/JP 4-digit code ('2330', '7203'), or a company name (local or English).

  • market: 'kr'|'us'|'tw'|'jp' (optional) — disambiguates codes/names shared across markets (TW and JP both use 4-digit codes).

  • limit: 1-10 peers (default 5).

  • same_market_only: true = restrict peers to the company's own market (default false — a KR chipmaker can sit next to a US one).

  • rank: 'size' (default) = same industry group, nearest by market cap (or revenue where there is no price feed); 'segments' = rank by business-mix similarity — each company's segment revenue shares are mapped to standard industries (companies without segment data count as 100% their own industry) and compared by cosine similarity, ties broken by size. Conglomerates (Sony: games/music/pictures/electronics/finance) then get conglomerate peers instead of whichever single bucket they were filed under.

  • response_format: 'markdown' (default) or 'json'.

Returns: {company:{name, name_en, market, ticker|code}, basis:'sector'|'size'|'segments', sector:{group, label, name}, industry_mix:{vector:{industry:share}, primary:[industry], from_segments:bool} (rank='segments' only), peers:[{name, name_en, market, ticker|code, market_cap, per, pbr, roe, rev_cagr_3y, rs_pctile, ret_120d, similarity?, primary_industry?, has_segments?}], segments:{fiscal_year, rows:[{segment, kind, revenue_external, share_pct}]}, notes}.

Examples:

  • {company:'7203'} -> Toyota + transportation-equipment peers, with its Automotive / Financial Services segment split

  • {company:'005930', same_market_only:true} -> Samsung Electronics + KR tech-hardware peers only

  • {company:'6758', rank:'segments'} -> Sony ranked against other multi-segment conglomerates by business mix

Use when: building a comparison table or choosing competitors for a financial comparison. Don't use for strategy screens (screen_*) or for full financial statements (get_dart_financials / get_edgar_financials). Notes: company-level classification only; segment names may be geographic (Japan/Asia/USA) when a company defines its reportable segments by region. Market cap is in the company's listing currency, so cross-market rank by proximity is approximate. Errors: unknown/ambiguous company -> candidate list; no classification -> basis='size' with a note.

ParametersJSON Schema
NameRequiredDescriptionDefault
rankNo'size' (default) or 'segments' = business-mix similarity
limitNoPeers to return (default 5)
marketNoRestrict resolution to one market
companyYesTicker, KR 6-digit code, TW/JP 4-digit code, or name
response_formatNoOutput format (default markdown)
same_market_onlyNoOnly peers from the company's own market

Output Schema

ParametersJSON Schema
NameRequiredDescription
basisNo
notesNo
peersYes
sectorNo
companyYes
segmentsNo
industry_mixNo

TDQS

A5/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description richly discloses behavior: market-cap proximity ranking, same-market prioritization, fallback to size peers when no classification exists, the informational segment-revenue split, error behavior returning candidate lists, and currency caveats for cross-market comparisons. None of this contradicts the 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?

The description is long but earns its length for a tool with 6 parameters, 4 markets, and nuanced ranking logic. It is well-structured with Args, Returns, Examples, Use when, Notes, and Errors sections, and the core purpose is front-loaded before the parameter detail.

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?

With an output schema present and a description that details the return object's fields, ranking bases, segment payload, and error behavior, the tool is fully specified. It covers edge cases like missing classification, geographic segment names, and cross-market currency approximation, so an agent has everything needed to call it correctly.

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?

Although schema coverage is 100%, the description adds substantial meaning: accepted company identifier formats per market, the market disambiguation rationale, default behavior for same_market_only, and a detailed explanation of the 'segments' rank option including cosine similarity and tie-breaking. Examples map concrete values to expected behavior.

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 opens with a specific verb and resource: 'Comparison set for one company across KR / US / TW / JP: the company plus its closest peers.' It clearly defines the tool's scope and distinguishes it from siblings by explicitly naming what it is not for, such as strategy screens and full financial statements.

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 gives direct usage guidance: 'Use when: building a comparison table or choosing competitors for a financial comparison. Don't use for strategy screens (screen_*) or for full financial statements (get_dart_financials / get_edgar_financials).' It also explains fallback behavior and disambiguation contexts, leaving no ambiguity about when to invoke this tool.

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

get_portfolioMy PortfolioA
Read-only
Inspect

Return the user's whole portfolio (listed stocks plus cash, crypto, ETF and physical assets) valued at the latest prices, with return and asset allocation. Crypto and ETFs use live ccxt quotes, stocks the latest close in the database, cash and physical assets the registered amount. allocation is aggregated per currency; combined converts everything to KRW using the FRED DEXKOUS rate.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
errorNo
notesNo
holdingsNo
allocationNo
total_valueNo

TDQS

A3.7/5.0
Behavior1/5

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

The description reveals live ccxt quotes and a FRED DEXKOUS conversion, which are open-world external dependencies, but the annotations declare openWorldHint=false. This contradicts the annotation and undermines the agent's assumptions about determinism and external data access. Per rubric, an annotation contradiction drops this to 1.

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 earning its place: scope in sentence one, valuation sources in sentence two, aggregation/currency behavior in sentence three. It is front-loaded and free of filler.

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 a no-argument tool with an output schema, the description covers asset coverage, per-asset valuation method, return/allocation outputs, and currency aggregation. Nothing an agent needs to select and invoke it correctly is missing, aside from the annotation inconsistency already penalized.

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?

There are zero parameters, so the schema already fully documents the input side. The description doesn't need to add parameter semantics, and it doesn't introduce any misleading input expectations.

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 opens with a specific verb and resource: 'Return the user's whole portfolio,' then enumerates asset classes and outputs such as valuation, return, and allocation. This clearly distinguishes it from sibling get_* tools as the aggregate portfolio view rather than a market/ticker/screener tool.

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 use case is implied (obtain an overall portfolio snapshot), but the description never tells the agent when to prefer this over siblings like get_stock_prices or import_portfolio, and it names no exclusions. With 35 siblings, explicit routing guidance would strengthen it.

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

get_stock_pricesDaily Stock Prices (FinBridge DB)A
Read-only
Inspect

Get daily OHLCV price history from the local finbridge database (populated by the nightly ingest jobs). Rows are returned newest first.

Price coverage by market — we only store what we have redistribution rights to:

  • Korea (DART + Financial Services Commission): full daily history, corporate-action adjusted. SERVED.

  • Taiwan (TWSE OpenAPI, Open Government Data License): daily history. SERVED.

  • US (Databento EQUS.SUMMARY): daily history from 2023-03-28. SERVED. Split-adjusted; dividend-adjusted closes exist where SEC-reported dividends do (adj_close).

  • Japan: NOT served. EDINET publishes disclosure documents, not prices, so we hold Japanese filings and the company master but no quotes.

Args:

  • company: a ticker (US 'AAPL', TW/JP 4-digit '2330'), a KR 6-digit stock code ('005930'), or a company name in the local language or English ('TSMC', 'Toyota', '삼성전자'). Resolution priority: exact ticker > 6-digit KR code > exact name (name or English name) > partial name (multiple partial matches return a candidate list error).

  • from / to: optional YYYY-MM-DD range bounds (inclusive)

  • limit: max rows, 1-500 (default 60)

  • response_format: 'markdown' (default) or 'json'

Plan note: the free plan serves the most recent 130 trading sessions of each name; paid plans serve the full stored history. When the window is trimmed the response carries a plan_limit field saying so.

Returns: {company: {name, source, ticker|stock_code}, count, truncated, prices: [{date, open, high, low, close, volume}]} — newest date first; truncated=true means older rows exist beyond 'limit'.

Examples:

  • {company: '005930', limit: 30} -> last 30 KR trading days for Samsung Electronics

  • {company: '005930', from: '2026-01-01', to: '2026-06-30'} -> Samsung Electronics H1 2026

Use when: historical closes/volumes for charting or return calculations from ingested data. Don't use for real-time quotes (use live-source tools) or crypto (get_crypto_ohlcv). Errors: unknown company -> no-match or candidate-list error; JP/EU company -> no-prices error (those markets carry statements only); no price rows -> a market-specific hint (new listing, delisted, nightly lag).

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoEnd date YYYY-MM-DD (inclusive)
fromNoStart date YYYY-MM-DD (inclusive)
limitNoMax rows, 1-500 (default 60), newest first
companyYesKR 6-digit stock code (e.g. '005930') or company name
response_formatNo'markdown' for a table, 'json' for compact machine-readable outputmarkdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYes
pricesYes
companyYes
truncatedNo

TDQS

A5/5.0
Behavior5/5

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

Annotations only convey read-only behavior, but the description discloses much more: data is populated by nightly ingest jobs, rows are newest-first, market coverage depends on redistribution rights, the free plan trims history and adds a plan_limit field, and errors include market-specific hints. All of this is consistent with readOnlyHint=true; there is 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?

The description is long but tightly organized into front-loaded summary, market coverage, args, returns, examples, usage guidance, and errors. Each section carries necessary information for a complex multi-market tool, and the opening sentence immediately communicates the core function.

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?

The description covers the full calling context: data availability per market, identifier resolution rules, plan-based limitations, response structure including truncation, and error behavior for unknown or unsupported companies. Given the tool's complexity, the description leaves little for the agent to infer.

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?

Although the schema already describes all five parameters, the description adds significant meaning: company resolution priority with market-specific examples, inclusive date range semantics, the 1-500 limit with its default and plan-trimming behavior, and response_format output differences. The examples further clarify real usage patterns.

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 first sentence states a specific action and resource: getting daily OHLCV price history from the local finbridge database. It further differentiates itself from siblings by explicitly ruling out real-time quotes and crypto, naming get_crypto_ohlcv as the alternative.

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 'Use when' and 'Don't use' sections give explicit guidance: use it for historical closes/volumes for charting or return calculations, and avoid it for real-time quotes or crypto. The market-coverage section also tells agents when a request for Japanese or EU companies will fail, enabling routing to other tools.

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

get_technicalsTechnical Indicators (FinBridge DB)A
Read-only
Inspect

Latest technical-indicator snapshot for a single KR or US company from the local finbridge database (indicators_latest, refreshed by the nightly 'indicators' ingest from daily prices), plus an optional on-demand historical series and a plain-language signal summary.

Indicators: SMA 5/20/60/120, EMA 12/26, RSI(14, Wilder), MACD(12,26,9), Bollinger(20,2), ATR(14), 52-week high/low and % distance, returns over 1/5/20/60/120/250 trading days, 20-day volume ratio, above-SMA20/60 flags, and SMA20xSMA60 golden/dead cross (within the last 3 sessions).

Args:

  • company: US ticker (e.g. 'AAPL'), KR 6-digit stock code (e.g. '005930'), or company name. Resolution: exact ticker > 6-digit code > exact name > partial name.

  • history: 0-250 (default 0). 0 = latest snapshot only; >0 recomputes the last N sessions of close/sma20/sma60/rsi14/macd on the fly (not stored).

  • response_format: 'markdown' (default) or 'json'.

Returns: {company:{name,source,ticker|stock_code}, as_of, indicators:{...all snapshot fields...}, signals:[text], history:[{date,close,sma20,sma60,rsi14,macd}], notes}.

Examples:

  • {company: 'AAPL'} -> Apple's latest snapshot + signal summary

  • {company: '005930', history: 60} -> Samsung Electronics snapshot + last 60 sessions of sma/rsi/macd

Use when: reading one company's momentum/trend/overbought-oversold state, or charting an indicator series. Don't use to rank many companies (use screen_technical) or for live intraday quotes (use the live-source tools). Notes: KR/US/TW prices are adjusted for corporate actions but not dividends (indicators around dividend events may be slightly distorted); US history starts 2023-03-28 (volume from 2024-07-01) so long-window figures are shallower there. Market data, not investment advice. Errors: unknown company -> no-match/candidate-list error; 'No technical snapshot' -> no indicator row for this company, with a market-specific reason (JP/EU carry no prices; new listing or delisted elsewhere).

ParametersJSON Schema
NameRequiredDescriptionDefault
companyYesUS ticker (e.g. 'AAPL'), KR 6-digit stock code (e.g. '005930'), or company name
historyNo0 = latest snapshot only; 1-250 = also return that many recent sessions of close/sma20/sma60/rsi14/macd
response_formatNo'markdown' for tables, 'json' for compact machine-readable outputmarkdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
as_ofNo
notesNo
companyYes
historyNo
signalsNo
indicatorsYes

TDQS

A5/5.0
Behavior5/5

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

Annotations only declare readOnlyHint and openWorldHint; the description goes far beyond by explaining data origin and refresh cadence (nightly ingest), on-demand recomputation not stored, corporate-action adjustment caveats, US history start dates, and expected error cases. These behaviors materially affect interpretation of returned data.

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 long but appropriately so for a tool with many indicators and caveats. The core purpose is front-loaded, and the headed sections (Indicators, Args, Returns, Examples, Use when, Notes, Errors) are dense with actionable information. No sentence is filler.

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?

For a complex tool, this description covers everything needed to call it correctly: parameters, return shape, examples, alternatives, error modes, data caveats, and market-data disclaimer. An agent can confidently decide to invoke it and interpret results from the description alone.

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 coverage is 100%, but the description adds meaning beyond the schema: company resolution order (exact ticker > 6-digit code > exact name > partial name), the exact recompute behavior of history, and the response_format effect. These details are not present in the input schema alone.

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?

States a specific verb and resource: fetching the latest technical-indicator snapshot for a single KR or US company. It enumerates the indicators covered, distinguishes single-company scope from screening tools, and the title/name are not merely restated.

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 the tool ('reading one company's momentum/trend/overbought-oversold state, or charting an indicator series') and when not to ('Don't use to rank many companies (use screen_technical) or for live intraday quotes (use the live-source tools)'). It names sibling tools and gives exclusion conditions.

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

get_valuationCompany Valuation (FinBridge DB)A
Read-only
Inspect

Get the latest valuation snapshot for one KR or US company from the local finbridge database: market cap (latest close x shares) with PER, PBR, PSR, ROE, debt ratio, and 3-year revenue/net-income CAGR, joined to the company's latest annual fundamentals. Includes a plain-language interpretation and 1-2 same-market percentile hints (PER cheapness, ROE rank). Computed by the nightly valuation ingest job.

Share counts: KR uses exact listed shares from the data.go.kr feed; US approximates diluted shares as net_income / eps_diluted. PER prefers price / eps_diluted, falling back to market_cap / net_income. Any ratio whose denominator is null or <= 0 is returned as null.

Args:

  • company: US ticker (e.g. 'AAPL'), KR 6-digit stock code (e.g. '005930'), or company name. Resolution priority: exact ticker > 6-digit code > exact name > partial name (multiple partial matches return a candidate-list error).

  • response_format: 'markdown' (default) or 'json'

Returns: {company: {name, source, ticker|stock_code}, as_of, fiscal_year, currency, price, shares, market_cap, per, pbr, psr, roe, debt_ratio, rev_cagr_3y, ni_cagr_3y, peer_context: {market, per_percentile, roe_percentile}, interpretation}. Ratios are plain numbers; roe/debt_ratio/CAGR are in percent.

Examples:

  • {company: '005930'} -> Samsung Electronics PER/PBR/ROE plus "PER in the cheapest N% of the KR market"

  • {company: 'AAPL'} -> Apple valuation snapshot with US-market percentiles

Caveats: PER/PBR/PSR/ROE/debt are dimensionless same-currency ratios — no FX conversion is applied; market_cap keeps the listing currency. KR fundamentals are K-IFRS and US are US-GAAP, so cross-market comparisons are approximate. This is snapshot data (not real-time) and not investment advice.

Use when: assessing one company's valuation/quality at a glance, or comparing it to its own market. Don't use for many-company ranking (use screen_companies / query_db) or raw statements (get_dart_financials / get_edgar_financials). Errors: unknown company -> no-match or candidate-list error; 'no valuation snapshot' -> the valuation ingest job has not produced a row for this company (needs a price and latest-annual fundamentals).

ParametersJSON Schema
NameRequiredDescriptionDefault
companyYesUS ticker (e.g. 'AAPL'), KR 6-digit stock code (e.g. '005930'), or company name
response_formatNo'markdown' for a table + interpretation, 'json' for compact machine-readable outputmarkdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
pbrNo
perNo
psrNo
roeNo
as_ofNo
priceNo
sharesNo
companyYes
currencyNo
debt_ratioNo
market_capNo
ni_cagr_3yNo
updated_atNo
fiscal_yearNo
rev_cagr_3yNo
peer_contextNo
interpretationNo

TDQS

A5/5.0
Behavior5/5

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

Annotations declare readOnlyHint=true, which is consistent with 'Get', but the description adds substantial behavioral context: share-count derivation differences between KR and US, PER fallback logic, null-ratio handling, nightly ingest job, no FX conversion, K-IFRS vs US-GAAP caveats, and snapshot-not-real-time status. These are exactly the kind of non-obvious behaviors an agent needs to interpret results correctly.

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 long but extremely well structured with clear sections: Args, Returns, Examples, Caveats, Use when, and Errors. The core purpose and metrics are front-loaded, and every paragraph adds distinct value. The examples and error explanations earn their place in a tool with this much computational nuance.

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 the tool's complexity, the description covers all needed context: supported identifiers, return object shape, calculation rules, fallback behavior, error cases, use vs. non-use cases, and accounting/FX caveats. An agent can determine whether to call this tool, how to pass parameters, and how to interpret the result without external lookup.

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?

Although the input schema already covers both parameters 100%, the description goes further: it explains company resolution priority ('exact ticker > 6-digit code > exact name > partial name'), the candidate-list error behavior for ambiguous partial matches, the response_format default, and the meaning of ratio units (percent). This materially helps an agent form correct argument values.

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 opens with a specific verb and resource: 'Get the latest valuation snapshot for one KR or US company from the local finbridge database.' It enumerates the exact metrics returned (market cap, PER, PBR, PSR, ROE, debt ratio, CAGRs) and explicitly contrasts itself with raw-statement tools like get_dart_financials/get_edgar_financials, so there is no ambiguity about what this tool does.

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 'Use when' section explicitly states the intended scenarios: 'assessing one company's valuation/quality at a glance, or comparing it to its own market.' It also names exclusions and alternatives: 'Don't use for many-company ranking (use screen_companies / query_db) or raw statements (get_dart_financials / get_edgar_financials).' This gives an agent clear routing criteria.

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

import_portfolioImport Portfolio HoldingsA
Destructive
Inspect

Register holdings read from a brokerage (MTS/HTS) screenshot or an asset table into the user's portfolio. Accepts listed stocks (KR/US/TW/JP) as well as cash, crypto (BTC etc.) and physical assets (gold): stocks are matched against the database, crypto and gold (PAXG) get live ccxt quotes, cash and physical assets are stored at the given value. For ETFs or foreign products not in the database, pass value directly. If the screen shows a type/category column, pass asset_class as well (cash|bond|physical|growth|dividend|crypto|other; Korean labels 현금|채권|현물|성장주|배당주|가상자산|기타 are accepted). Registered listed stocks are also added to the watchlist automatically.

ParametersJSON Schema
NameRequiredDescriptionDefault
replaceNotrue = wipe the existing portfolio (stocks + assets) and replace it; default false = merge
holdingsYesHoldings read from the screenshot or table

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
notesNo
holdingsNo
importedNo
unmatchedNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already mark destructiveHint=true and readOnlyHint=false, and the description adds substantial behavioral context beyond that: merge/replace semantics, live ccxt quotes for crypto and gold, direct-value storage for cash/physical/unsupported ETFs, and automatic watchlist registration. There is no contradiction with the annotations.

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 long but dense: each sentence covers a distinct asset category, pricing path, or caveat. It is front-loaded with the core purpose and then layers asset-type handling and parameter guidance. Minor restructuring could improve scannability, but there is little redundancy.

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?

For a complex import tool, the description covers the essential behavioral surface: accepted asset types, database matching, live quote behavior, direct-value fallback, replace/merge semantics, category label handling, and the watchlist side effect. An output schema exists and annotations cover the destructive nature, so no major missing context remains.

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%, so the baseline is met, but the description adds cross-parameter guidance that the schema alone does not provide: when to pass asset_class, when to pass value directly instead of relying on pricing, and how price_symbol/unit interact for PAXG and TLT-style symbols. This adds meaningful decision guidance for the holdings array.

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 opens with a specific verb and resource: 'Register holdings read from a brokerage (MTS/HTS) screenshot or an asset table into the user's portfolio.' It clearly distinguishes itself from siblings like add_to_watchlist and get_portfolio by emphasizing bulk portfolio registration and the automatic watchlist side effect for listed stocks.

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 gives strong usage context: it should be used when importing holdings from screenshots or tables, covering stocks, cash, crypto, and physical assets. It does not explicitly name alternatives or state when not to use it, but the input-source framing and write behavior separate it from the read-only and screening sibling tools.

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

query_dbFinBridge DB Read-Only SQLA
Read-only
Inspect

Run a single read-only SELECT query against the local finbridge database (ingested KR/US fundamentals, filings, daily prices). The statement must start with SELECT or WITH; multiple statements, PRAGMA, and any write/DDL keywords (INSERT/UPDATE/DELETE/DROP/ALTER/CREATE/ATTACH/...) are rejected. The query is executed as SELECT * FROM () LIMIT on a read-only connection.

Args:

  • sql: one SELECT (or WITH ... SELECT) statement. A single trailing ';' is tolerated.

  • limit: max rows returned, 1-500 (default 50)

  • response_format: 'markdown' (default, table) or 'json' (compact)

Returns: {columns: [name], rows: [[cell, ...]], row_count, truncated} — truncated=true means more rows matched than 'limit'.

Examples (v_financials / v_latest_annual views are the easiest entry points):

  • Largest companies by latest annual revenue: "SELECT name, ticker, stock_code, fiscal_year, revenue FROM v_latest_annual ORDER BY revenue DESC LIMIT 10"

  • Samsung Electronics annual trend: "SELECT fiscal_year, revenue, operating_income, net_income FROM v_financials WHERE stock_code = '005930' AND quarter = 0 ORDER BY fiscal_year DESC"

  • KR vs US company counts: "SELECT source, COUNT(*) AS n FROM companies GROUP BY source"

  • Recent Samsung Electronics closes: "SELECT date, close FROM prices_daily p JOIN companies c ON c.id = p.company_id WHERE c.stock_code = '005930' ORDER BY date DESC LIMIT 20" (prices_daily holds KR, US, TW; US history starts 2023-03-28)

Use when: custom aggregation/joins over ingested data that screen_companies cannot express. Don't use for anything that writes — it will be rejected — or for live quotes (use the live-source tools). Errors: non-SELECT input, ';' inside, or forbidden keywords -> rejected with the reason; unknown table/column -> SQL error with a hint to call get_db_schema first.

ParametersJSON Schema
NameRequiredDescriptionDefault
sqlYesA single read-only SELECT (or WITH ... SELECT) statement
limitNoMax rows returned, 1-500 (default 50)
response_formatNo'markdown' for a table, 'json' for compact machine-readable outputmarkdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
rowsYes
columnsYes
row_countYes
truncatedNo

TDQS

A4.9/5.0
Behavior5/5

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

The description goes far beyond the readOnlyHint annotation by disclosing the exact execution model: the query is wrapped as SELECT * FROM (<sql>) LIMIT <limit> on a read-only connection, and forbidden constructs such as PRAGMA, multiple statements, and DDL keywords are rejected. It also explains the truncated flag semantics and error behavior, giving the agent a realistic picture of outcomes before invoking.

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 long but well-structured with clear sections (Args, Returns, Examples, Use when, Errors), and every part earns its place for a tool with nontrivial constraints. Core rules are front-loaded before parameters and examples, and no filler or tautological phrasing is present.

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?

For a complex SQL-execution tool, the description is remarkably complete: it covers accepted syntax, rejected patterns, result shape, row limits, error behavior, example queries, and alternative tools. With an output schema and readOnlyHint already present, nothing essential is missing for an agent to select and invoke this tool 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 the baseline is 3, but the description adds value through concrete examples that clarify how sql, limit, and response_format work together, including real view names and join patterns. It also adds nuances the schema lacks, such as tolerating a single trailing ';' and noting which data sources and date ranges are available.

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 opens with a specific verb and resource: 'Run a single read-only SELECT query against the local finbridge database,' and names the data domains (KR/US fundamentals, filings, daily prices). It clearly distinguishes itself from siblings by emphasizing the custom SQL/read-only scope, so an agent can tell it apart from screen_companies or get_stock_prices.

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 it ('custom aggregation/joins over ingested data that screen_companies cannot express') and when not to use it ('Don't use for anything that writes... or for live quotes'), even directing to 'live-source tools' as alternatives. It also provides the error-recovery hint to call get_db_schema first for unknown tables.

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

screen_canslimCAN SLIM Screener (FinBridge DB)A
Read-only
Inspect

Screen KR and/or US stocks against William O'Neil's CAN SLIM checklist (as taught by David Ryan), joining the nightly valuation_latest (earnings/sales growth, ROE, PER) and indicators_latest (relative strength, distance from the 52-week high) snapshots. Returns fundamentally strong momentum leaders, sorted by RS by default.

Only C, A, N, S, L are coded as filters — I (institutional sponsorship) and M (market direction) require fund-flow and index-level data that cannot be evaluated from a single stock's snapshot, so they are intentionally omitted: C — Current quarterly earnings: latest-quarter diluted-EPS YoY >= c_min (default 25). Quarter codes compare like-for-like a year apart (1=Q1, 2=cumulative half, 3=Q3). A — Annual earnings & quality: latest annual diluted-EPS YoY >= a_min (default 25) AND ROE >= roe_min (default 17) N — New highs: price within near_high_pct% of the 52-week high (default 15) S — Sales: latest annual revenue YoY > 0 when require_sales is true (default true) L — Leader: RS rating (national percentile 1-99) >= rs_min (default 80) A metric that is NULL (e.g. growth base was a loss, so the sign-flipped percentage is dropped) fails its comparison and the stock is excluded.

Args:

  • market: 'kr' (DART/KOSPI+KOSDAQ), 'us' (EDGAR), or 'all' (default)

  • c_min: min latest-quarter EPS YoY %, CAN SLIM C (default 25)

  • a_min: min latest-annual EPS YoY %, CAN SLIM A (default 25)

  • roe_min: min ROE %, quality gate under A (default 17)

  • rs_min: min RS percentile 1-99, CAN SLIM L (default 80)

  • near_high_pct: max % below the 52-week high, CAN SLIM N (default 15; smaller = closer to the high)

  • require_sales: require positive annual revenue growth, CAN SLIM S (default true)

  • min_vol_avg20: optional min 20-day average volume (liquidity filter for illiquid microcaps)

  • min_price: optional min close price (O'Neil avoids low-priced stocks; e.g. 10 for US$, 5000 for KRW)

  • sort_by: rs_pctile|eps_q_yoy|eps_a_yoy|sales_a_yoy|roe|pct_from_52w_hi|close (default rs_pctile)

  • order: 'asc'|'desc' (default 'desc'); limit: 1-50 (default 20); response_format: 'markdown'|'json'

Returns: {count, market, criteria:{c_min, a_min, roe_min, rs_min, near_high_pct, require_sales}, rows:[{name, source, ticker|stock_code, as_of, close, eps_q_yoy, eps_a_yoy, sales_a_yoy, roe, rs_pctile, pct_from_52w_hi, per}]}. Growth/ROE values are percent; pct_from_52w_hi is <= 0.

Examples:

  • US CAN SLIM leaders with liquidity: {market:'us', min_vol_avg20: 500000}

  • Strict KR growth leaders near highs: {market:'kr', c_min: 40, a_min: 30, rs_min: 90, near_high_pct: 10}

Use when: finding CAN SLIM-style growth leaders combining earnings/sales acceleration with strong relative strength. Don't use for a single company's valuation detail (get_valuation), the Minervini price template (screen_minervini), or raw statements (get_dart_financials / get_edgar_financials). Notes: CAN SLIM's I (institutional sponsorship) and M (market direction) cannot be screened from single-stock data — only C, A, N, S, L are applied. Growth uses diluted-EPS/revenue YoY; a company whose prior-period base is non-positive (loss->profit sign flip) has a null metric and is excluded. KR fundamentals follow K-IFRS and US follow US-GAAP, so cross-market growth/ROE comparisons are approximate. KR/US/TW prices are adjusted for corporate actions but not dividends (indicators around dividend events may be slightly distorted); US history starts 2023-03-28 (volume from 2024-07-01) so long-window figures are shallower there. Snapshot from the nightly ingest, not real-time, and not investment advice. Errors: an empty result is not an error (count 0 = nothing passed today); 'database has not been built yet' -> the valuation/indicators ingest has not run.

ParametersJSON Schema
NameRequiredDescriptionDefault
a_minNoMin latest-annual EPS YoY % — CAN SLIM A (default 25)
c_minNoMin latest-quarter EPS YoY % — CAN SLIM C (default 25)
limitNoMax rows, 1-50 (default 20)
orderNoSort direction (default desc)desc
marketNoMarket: 'kr' (default), 'us', or 'all'. ⚠Taiwan is not offered here — TWSE publishes a cumulative snapshot with no quarterly EPS growth or ROE, so every row would fail C/A silently.kr
rs_minNoMin RS percentile 1-99 — CAN SLIM L (default 80)
roe_minNoMin ROE % — quality gate under CAN SLIM A (default 17)
sort_byNoSort column (default rs_pctile)rs_pctile
min_priceNoMin close price (O'Neil avoids low-priced stocks; e.g. 10 for US$, 5000 for KRW)
min_vol_avg20NoMin 20-day average volume (liquidity filter)
near_high_pctNoMax % below the 52-week high — CAN SLIM N (default 15)
require_salesNoRequire positive annual revenue growth — CAN SLIM S (default true)
response_formatNo'markdown' for a table, 'json' for compact machine-readable outputmarkdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
rowsYes
countYes
notesNo
orderNo
marketYes
signalsNo
sort_byNo
us_noteNo
criteriaNo

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only provide readOnlyHint=true and openWorldHint=false, so the description carries the behavioral burden. It discloses nightly snapshot timing, NULL-metric exclusion, accounting-standard differences, dividend/corporate-action caveats, and the empty-result-not-error behavior—all beyond what annotations convey.

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 well-structured with clear sections: overview, criteria, args, returns, examples, usage, notes, and errors. It is long, but the complexity of a 13-parameter screener justifies most of it; the I/M omission is repeated in both the intro and notes, adding minor redundancy.

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?

The description covers the full decision surface: filter semantics, return shape, example calls, market-specific caveats, known error messages, and data freshness limitations. With an output schema present and all parameters documented, nothing needed to call this tool correctly is missing.

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 the baseline is 3, but the description adds substantial value: it maps each parameter to a CAN SLIM criterion, explains quarter-code comparisons, gives examples, and specifies units. However, it incorrectly states that market's default is 'all' while the schema says the default is 'kr', which is a real reliability concern.

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 opens with a specific verb and resource: it "screens KR and/or US stocks" against the CAN SLIM checklist using two named snapshots. It also distinguishes itself from siblings by explicitly saying not to use it for get_valuation, screen_minervini, or raw statement tools.

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?

It has an explicit 'Use when' section naming the exact scenario and an explicit 'Don't use for' section that names four sibling tools. It also explains why CAN SLIM's I and M criteria are intentionally not screened, preventing the agent from expecting them.

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

screen_companiesScreen Companies (FinBridge DB)A
Read-only
Inspect

Screen companies across five markets on annual fundamentals stored in the local finbridge database: Korea (DART), the US (SEC EDGAR), Taiwan (TWSE/TPEx), Japan (EDINET) and Europe (ESEF/IFRS). Filters and sorting run on standard metrics plus derived ratios; only annual rows (quarter=0) are considered. Base amounts are in each company's reporting currency — KRW, USD, TWD, JPY, or for Europe whatever the filer reports in (EUR, DKK, SEK, NOK, PLN, ...) — so absolute-value thresholds are market-dependent and cross-market (market='all') screens work best with ratio metrics (margins, roe, debt_ratio).

Coverage note: Taiwan carries only the latest reported period, because TWSE publishes a snapshot rather than history. Europe is still loading and is thinner than the others: about 1 in 8 rows has no operating_income (the filer tags it with a company extension rather than the IFRS concept) and about 1 in 5 has no revenue (banks and investment entities report interest revenue or fair-value gains, not a single IFRS revenue total — we leave the column empty rather than fill it with a component that would make margins mean different things per row). Germany and Ireland are largely absent from the ESEF index, and European rows carry no ticker yet (page_url is null). Every market here has financial statements — none of them is master-only.

What 'eu' means: any issuer that files under ESEF, i.e. has securities admitted to an EU/EEA/UK regulated market. That is a listing venue, not a domicile, so foreign issuers listed in Europe appear here too (Samsung Electronics, Toyota Caetano Portugal, Kazatomprom) and amounts stay in the filer's own reporting currency. A company cross-listed in several of our markets appears once per market with that market's own filing, so market='all' can show it more than once — this is not new to Europe (Toyota is already under both 'us' as TOYOTA MOTOR CORP and 'jp' as トヨタ自動車株式会社). Screen one market at a time when you need each company exactly once.

Period fallback: a single-market screen normally uses each company's latest ANNUAL report. When a market has no annual rows yet (Taiwan today reports a half-year cumulative), the screen drops to that market's latest available period and the response says which one in the 'period' field — e.g. "FY2026 Q2 (year-to-date cumulative)". Within one market every row is then the same period, so the ranking holds. market='all' never does this: lining up a half-year revenue against a full-year one would be a silently wrong table.

Args:

  • market: 'kr' (DART), 'us' (EDGAR), 'tw' (TWSE/TPEx), 'jp' (EDINET), 'eu' (ESEF), or 'all' (default)

  • fiscal_year: specific fiscal year; omit to use each company's latest annual report

  • filters: up to 5 of {metric, op, value}. op: gt|gte|lt|lte|eq. value is a number (ratios are in percent, e.g. 20 = 20%).

  • sort_by: metric to sort on (default 'revenue'); order: 'asc'|'desc' (default 'desc')

  • limit: 1-100 (default 20); response_format: 'markdown'|'json'

Metrics: revenue, gross_profit, operating_income, net_income, eps_diluted, assets, liabilities, equity, cash_and_equivalents, operating_cash_flow, plus derived operating_margin (operating_income/revenue100), net_margin (net_income/revenue100), roe (net_income/equity100), debt_ratio (liabilities/equity100).

Returns: {count, market, fiscal_year|'latest', sort_by, order, rows: [{name, source, ticker|stock_code, fiscal_year, currency, }]}. If a company reports under multiple accounting bases for the same year it may appear once per basis.

Examples:

  • KR companies with operating margin > 20%: {market: 'kr', filters: [{metric: 'operating_margin', op: 'gt', value: 20}], sort_by: 'operating_margin'}

  • US mega caps by revenue in FY2025: {market: 'us', fiscal_year: 2025, sort_by: 'revenue', limit: 10}

Use when: ranking or filtering many companies at once. Don't use for a single known company's statement detail (query_db or get_dart_financials / get_edgar_financials). Errors: 'database has not been built yet' — ingest has not run; an empty result is not an error (count 0).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax rows, 1-100 (default 20)
orderNoSort direction (default desc)desc
marketNoMarket: 'kr' (DART), 'us' (EDGAR), 'tw' (TWSE/TPEx), 'jp' (EDINET), 'eu' (ESEF), or 'all' (default)all
filtersNoUp to 5 metric filters, ANDed together
sort_byNoMetric to sort by (default revenue)revenue
fiscal_yearNoSpecific fiscal year; omit to use each company's latest annual report
response_formatNo'markdown' for a table, 'json' for compact machine-readable outputmarkdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
rowsYes
countYes
orderNo
marketYes
periodNo
sort_byNo
fiscal_yearNo

TDQS

A5/5.0
Behavior5/5

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

Annotations only state readOnlyHint=true, but the description goes far beyond that: only annual rows (quarter=0) are considered, amounts are in each filer's reporting currency, Taiwan has only the latest period, Europe has specific data-coverage gaps, period fallback behavior is explained, market='all' never mixes periods, and empty results are not errors. None of this contradicts the 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?

The description is long, but it is organized into labeled, decision-relevant sections: market scope, coverage caveats, 'eu' semantics, period fallback, args, metrics, returns, examples, use-when, and errors. It is front-loaded with the core purpose and every section earns its place given the complexity of five markets and several data-quality nuances.

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?

The description covers market scope, data quality, currency handling, duplicates, fallback behavior, parameter semantics, metric definitions, return shape, examples, when-not-to-use guidance, and error messages. It even explains the reasoning behind behaviors such as why market='all' refuses period fallback, which an agent needs to make correct calls.

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?

Even though schema coverage is 100%, the description adds essential meaning beyond the schema: formulas for derived ratios, the percent convention for ratios, market-dependent absolute-value caveats, fiscal_year omission meaning 'latest annual report', filters being ANDed, max and default values, the period field, and concrete examples. This substantially enriches the raw schema definitions.

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 opens with a specific verb and resource: 'Screen companies across five markets on annual fundamentals stored in the local finbridge database.' It names all five markets and the regulatory sources, and later explicitly distinguishes itself from query_db, get_dart_financials, and get_edgar_financials by saying it is not for single-company statement detail. This makes the tool clearly distinguishable from sibling screening and financial-statement tools.

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 contains an explicit 'Use when: ranking or filtering many companies at once' and a 'Don't use for a single known company's statement detail' branch with named alternatives. It also gives practical guidance on when to screen one market at a time, why market='all' can duplicate cross-listed companies, and why cross-market screens work best with ratio metrics.

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

screen_etfsScreen ETFs (FinBridge DB)A
Read-only
Inspect

Screen exchange-traded funds in the local finbridge database on the things that actually distinguish an ETF: premium/discount to NAV, fund size (AUM), the index it tracks, price momentum, and — for US funds — the audited calendar-year TOTAL return from the fund's own prospectus.

⚠These funds are excluded from screen_companies by construction: that tool ranks on annual financial statements, which funds do not file.

Coverage differs by market and the response says so per row:

  • KR (1,170 listed ETFs): NAV, AUM (net assets, KRW), listed units and the tracked index come from the same daily feed as prices, 2020-01-02 onward. premium_pct is close/NAV-1 computed on the SAME day (mixing dates would be meaningless).

  • US (5,868 ETFs): no NAV or AUM source exists that we may redistribute, so those fields are null. Instead total_return_pct carries the fund's audited calendar-year total return (distributions reinvested) from SEC prospectus data — the only distribution-inclusive number available.

⚠ret_20d / ret_120d are PRICE returns in every market: ETF distributions are not in the daily bars, so income funds look worse than they were. For US funds compare against total_return_pct to see the gap. ⚠aum is in the listing currency (KRW today). Do not rank across markets on it. ⚠total_return_pct is pinned to ONE calendar year across all rows (reported as total_return_year), because prospectus refresh dates differ per fund — ranking a 2024 figure against a 2025 one would be a silently wrong table.

Args:

  • market: 'kr', 'us', or 'all' (default)

  • min_aum: minimum net assets in listing currency (KR only; e.g. 100000000000 = 1,000억)

  • max_abs_premium_pct: keep funds trading within this |premium| of NAV, e.g. 0.5

  • min_premium_pct: keep funds at or above this premium (negative values find discounts)

  • min_price, min_volume: liquidity floors (vol_avg20 is the 20-session average)

  • index_contains: substring of the tracked index name — 'TR' finds total-return index trackers, '코스피' finds KOSPI trackers

  • name_contains: substring of the fund name or ticker

  • total_return_year: calendar year for total_return_pct; omit for the best-covered year

  • sort_by: aum | premium | abs_premium | ret_20d | ret_120d | ret_250d | volume | total_return (default aum); order: 'asc'|'desc' (default desc)

  • limit: 1-100 (default 20); response_format: 'markdown'|'json'

Returns: {count, market, total_return_year, sort_by, order, rows: [{market, symbol, name, as_of, close, nav, premium_pct, aum, index_name, ret_20d, ret_120d, vol_avg20, total_return_pct, total_return_period}]}

Examples:

  • Large KR ETFs trading close to fair value: {market:'kr', min_aum: 100000000000, max_abs_premium_pct: 0.3, sort_by:'aum'}

  • KR ETFs at the deepest discount to NAV: {market:'kr', sort_by:'premium', order:'asc'}

  • KR trackers of a total-return index: {market:'kr', index_contains:'TR', sort_by:'aum'}

  • US ETFs by audited total return: {market:'us', sort_by:'total_return'}

Use when: choosing or comparing funds. Don't use for stocks (screen_companies) or for a single fund's price history (get_stock_prices). Errors: 'database has not been built yet' — ingest has not run; an empty result is not an error (count 0).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax rows, 1-100 (default 20)
orderNoSort direction (default desc)desc
marketNoMarket: 'kr', 'us', or 'all' (default)all
min_aumNoMinimum net assets in listing currency (KR only; US is null)
sort_byNoSort key (default aum)aum
min_priceNoMinimum last close in listing currency
min_volumeNoMinimum 20-session average volume
name_containsNoSubstring of the fund name or ticker
index_containsNoSubstring of the tracked index name ('TR' for total-return indices)
min_premium_pctNoKeep funds at or above this premium in percent (negative finds discounts)
response_formatNo'markdown' for a table, 'json' for compact outputmarkdown
total_return_yearNoCalendar year for total_return_pct; omit for the best-covered year (the response says which)
max_abs_premium_pctNoKeep funds within this |premium to NAV| in percent

Output Schema

ParametersJSON Schema
NameRequiredDescription
rowsYes
countYes
orderNo
marketYes
sort_byNo
total_return_yearNo

TDQS

A4.9/5.0
Behavior5/5

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

Despite readOnlyHint=true and openWorldHint=false already signaling safety, the description adds material behavioral context: KR vs US data availability, null NAV/AUM for US, price-return vs total-return semantics, same-day premium computation, AUM currency caveat, and the one-calendar-year pinning of total_return_pct. It also documents the 'database has not been built yet' error and that empty results are not an error. No annotation contradiction exists.

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 well-structured with warnings, per-market coverage, args, examples, and use-when sections, and it front-loads the core purpose. It is, however, longer than strictly necessary: the 'Args' and 'Returns' sections largely repeat information already present in the input and output schemas, so a few sentences add redundancy rather than new signal.

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?

The definition is complete for a complex, 13-parameter screening tool: it covers market-specific behavior, result semantics, sort options, error cases, and provides four representative invocation examples. The output schema already specifies the return shape, and the description supplements with caveats an agent needs to avoid producing misleading tables.

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 coverage is 100%, but the description goes well beyond the schema: it gives a concrete min_aum conversion example (100000000000 = 1,000억), explains that premium_pct is same-day close/NAV-1, shows how index_contains finds 'TR' or '코스피' trackers, and clarifies that total_return_year can be omitted for the best-covered year. These are semantics an agent could not derive from property descriptions alone.

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 opens with a concrete verb and resource: 'Screen exchange-traded funds in the local finbridge database' and immediately names the differentiating fields (NAV premium, AUM, index, momentum, total return). It also distinguishes itself from screen_companies, so an agent can discriminate among sibling screening tools without inspecting their schemas.

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 'Use when' section states exactly when to call it ('choosing or comparing funds') and explicitly says not to use it for stocks (screen_companies) or single-fund price history (get_stock_prices). The coverage-per-market and excluded-funds notes further narrow when this tool is appropriate.

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

screen_kellOliver Kell Cycle Screener — approximation (FinBridge DB)A
Read-only
Inspect

Screen KR, US and/or TW stocks for an Oliver Kell "Cycle of Price Action" long setup, evaluated on the nightly indicators_latest snapshot (daily corporate-action-adjusted KR prices).

APPROXIMATION: Oliver Kell's method is discretionary — his full cycle (reversal extension, EMA crossback, wedge pop, base-n-break, exhaustion) is a chart read, not a formula. This screener only proxies ONE phase: "a relative-strength leader in an uptrend, riding its short-term EMAs and not over-extended". It will miss real Kell setups and flag stocks that are not.

Conditions (all required):

  • close > 20-day EMA (uptrend, holding the 20EMA)

  • price is 0..'max_ext_pct'% above the 10-day EMA (above support but not exhausted)

  • RS percentile >= 'rs_min' (a leader)

  • if require_ema_stack: 10-day EMA > 20-day EMA (rising short-term stack)

Args:

  • market: 'kr', 'us', or 'all' (default)

  • rs_min: minimum RS percentile 1-99 (default 80; Kell trades leaders)

  • max_ext_pct: max % above the 10-day EMA before treating it as over-extended (default 15)

  • require_ema_stack: require 10EMA > 20EMA (default true)

  • min_vol_avg20: optional minimum 20-day average volume (liquidity filter)

  • min_price: optional minimum close price (avoid low-priced stocks; e.g. 10 for US$, 5000 for KRW)

  • sort_by: rs_pctile|pct_from_ema10|ret_20d|ret_5d|macd_hist|close (default rs_pctile)

  • order: 'asc'|'desc' (default 'desc'); limit: 1-50 (default 20); response_format: 'markdown'|'json'

Returns: {count, market, criteria:{rs_min, max_ext_pct, require_ema_stack}, rows:[{name, source, ticker|stock_code, as_of, close, ema10, ema20, pct_from_ema10, macd_hist, rs_pctile, ret_20d}]}.

Examples:

  • US leaders on EMA support: {market:'us', min_vol_avg20: 500000}

  • Tighter KR leaders near the 10EMA: {market:'kr', rs_min: 85, max_ext_pct: 8, min_vol_avg20: 100000}

Use when: shortlisting momentum leaders riding short-term EMAs (Kell style, approximate). Don't treat a pass as a Kell "buy" — the cycle phase and chart context are discretionary. For the 8-point trend template use screen_minervini; for arbitrary technicals use screen_technical. Notes: KR/US/TW prices are adjusted for corporate actions but not dividends (indicators around dividend events may be slightly distorted); US history starts 2023-03-28 (volume from 2024-07-01) so long-window figures are shallower there. This is an approximation of a discretionary method, not a faithful reproduction. Market data, not investment advice. Errors: an empty result is not an error (count 0 = nothing passed today); 'database has not been built yet' -> ingest/indicators has not run.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax rows, 1-50 (default 20)
orderNoSort direction (default desc)desc
marketNoMarket: 'kr' (default), 'us', 'tw', or 'all'. Japan has no redistributable price source, so it is not screenable.kr
rs_minNoMinimum RS percentile (default 80)
sort_byNoSort column (default rs_pctile)rs_pctile
min_priceNoMinimum close price (avoid low-priced stocks; e.g. 10 for US$, 5000 for KRW)
max_ext_pctNoMax % above the 10-day EMA before over-extended (default 15)
min_vol_avg20NoMinimum 20-day average volume (liquidity filter)
response_formatNo'markdown' for a table, 'json' for compact machine-readable outputmarkdown
require_ema_stackNoRequire 10-day EMA > 20-day EMA (default true)

Output Schema

ParametersJSON Schema
NameRequiredDescription
rowsYes
countYes
notesNo
orderNo
marketYes
signalsNo
sort_byNo
us_noteNo
criteriaNo

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses that evaluation happens on the nightly indicators_latest snapshot, that prices are corporate-action-adjusted but not dividend-adjusted, that US history has known shallow periods, and that an empty result is not an error. It also explains the 'database has not been built yet' error case.

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 long but well-structured with labeled sections: approximation, conditions, args, returns, examples, usage, notes, and errors. It front-loads the core purpose and caveats. The Args section repeats some schema content, but every other section earns its place.

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 10 parameters, zero required fields, a complex screening methodology, and an output schema, the description is remarkably complete. It defines the exact screening conditions, return fields, data caveats, use cases, alternatives, and error semantics. An agent has all the context needed to invoke and interpret this tool 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?

The schema already covers all 10 parameters with 100% description coverage, so the baseline is 3. The description adds meaning through rationale ('Kell trades leaders' for rs_min), concrete examples (e.g., min_vol_avg20: 500000, min_price 5000 KRW), and clarification of sort/format choices. It comfortably exceeds baseline but partially duplicates schema descriptions.

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 opens with a specific verb and resource: 'Screen KR, US and/or TW stocks for an Oliver Kell "Cycle of Price Action" long setup.' It also distinguishes itself from siblings in the 'Use when' paragraph, explicitly routing agents to screen_minervini for the 8-point trend template and screen_technical for arbitrary technicals.

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?

It explicitly states when to use the tool — 'shortlisting momentum leaders riding short-term EMAs (Kell style, approximate)' — and when not to, warning not to treat a pass as a Kell 'buy'. It names concrete alternatives and gives worked examples for US and KR usage.

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

screen_minerviniMinervini Trend Template Screener (FinBridge DB)A
Read-only
Inspect

Screen KR, US and/or TW stocks that pass Mark Minervini's 8-point Trend Template (from "Trade Like a Stock Market Wizard"), evaluated on the nightly indicators_latest snapshot (daily corporate-action-adjusted KR prices). Returns stage-2 uptrend leaders, sorted by relative strength by default.

The 8 criteria (all required):

  1. Price above the 150-day and 200-day moving averages

  2. 150-day MA above the 200-day MA

  3. 200-day MA rising (vs ~1 month ago) [can be relaxed via require_sma200_rising]

  4. 50-day MA above both the 150- and 200-day MAs

  5. Price above the 50-day MA

  6. Price at least 'above_low_pct'% above its 52-week low (default 25)

  7. Price within 'near_high_pct'% of its 52-week high (default 25)

  8. RS rating >= 'rs_min' (default 70), where RS is the national percentile (1-99) of blended 3/6/12-month momentum vs the stock's own market

Optionally also require a Volatility Contraction Pattern base via require_vcp. VCP detection here is an APPROXIMATION (heuristic swing/contraction count, not a discretionary chart read) and can miss valid bases or flag false positives.

Args:

  • market: 'kr' (DART/KOSPI+KOSDAQ), 'us' (EDGAR), or 'all' (default)

  • rs_min: minimum RS percentile 1-99 (default 70; Minervini prefers higher)

  • near_high_pct: max % below the 52-week high (default 25; smaller = tighter/closer to high)

  • above_low_pct: min % above the 52-week low (default 25)

  • require_sma200_rising: require criterion 3 (default true)

  • require_vcp: also require a heuristically-detected VCP base (vcp_setup=1) (default false; VCP is approximate)

  • min_vol_avg20: optional minimum 20-day average volume (liquidity filter; recommended to exclude illiquid microcaps)

  • min_price: optional minimum close price (Minervini avoids low-priced/penny stocks; e.g. 10 for US$, 5000 for KRW)

  • sort_by: rs_pctile|rs_120d|ret_120d|ret_20d|pct_from_52w_hi|close (default rs_pctile)

  • order: 'asc'|'desc' (default 'desc'); limit: 1-50 (default 20); response_format: 'markdown'|'json'

Returns: {count, market, criteria:{rs_min, near_high_pct, above_low_pct, require_sma200_rising}, rows:[{name, source, ticker|stock_code, as_of, close, sma50, sma150, sma200, rs_pctile, rs_120d, pct_from_52w_hi, pct_from_52w_lo, ret_120d}]}.

Examples:

  • US leaders in a confirmed uptrend: {market:'us', min_vol_avg20: 500000}

  • Strict KR setups near highs with strong RS: {market:'kr', rs_min: 85, near_high_pct: 15, min_vol_avg20: 100000}

Use when: finding stage-2 momentum leaders (Minervini/CAN SLIM style). Don't use for a single stock's detail (get_technicals), fundamentals (screen_companies/get_valuation), or arbitrary technical signals (screen_technical). Notes: RS threshold of 70 keeps only stocks outperforming ~70% of their national market. KR/US/TW prices are adjusted for corporate actions but not dividends (indicators around dividend events may be slightly distorted); US history starts 2023-03-28 (volume from 2024-07-01) so long-window figures are shallower there. Market data, not investment advice. Errors: an empty result is not an error (count 0 = nothing passed today); 'database has not been built yet' -> ingest/indicators has not run.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax rows, 1-50 (default 20)
orderNoSort direction (default desc)desc
marketNoMarket: 'kr' (default), 'us', 'tw', or 'all'. Japan has no redistributable price source, so it is not screenable.kr
rs_minNoMinimum RS percentile (default 70)
sort_byNoSort column (default rs_pctile)rs_pctile
min_priceNoMinimum close price (Minervini avoids low-priced stocks; e.g. 10 for US$, 5000 for KRW)
require_vcpNoAlso require a heuristically-detected VCP base (vcp_setup=1). VCP detection is approximate.
above_low_pctNoMin % above the 52-week low (default 25)
min_vol_avg20NoMinimum 20-day average volume (liquidity filter)
near_high_pctNoMax % below the 52-week high (default 25)
response_formatNo'markdown' for a table, 'json' for compact machine-readable outputmarkdown
require_sma200_risingNoRequire the 200-day MA to be rising (criterion 3)

Output Schema

ParametersJSON Schema
NameRequiredDescription
rowsYes
countYes
notesNo
orderNo
marketYes
signalsNo
sort_byNo
us_noteNo
criteriaNo

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses substantial behavioral context: VCP detection is an 'APPROXIMATION (heuristic swing/contraction count, not a discretionary chart read)', prices are 'adjusted for corporate actions but not dividends', US history has known start dates that affect long-window figures, and RS percentile interpretation is explained. It even clarifies that an empty result is not an error and what a specific database error message means.

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 long but justified by the tool's complexity (12 parameters, 8 screening criteria, multiple markets). It is well-structured with clear sections: criteria list, arguments, return shape, examples, use-when, notes, errors. It drops one point because the Arguments section partially repeats schema descriptions and the 8-criteria list, while valuable, adds substantial length; a slightly tighter version would be even more concise.

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?

The description is complete for a complex screening tool: it covers the data source snapshot, all filter semantics, return fields, sorting options, example invocations, concrete use/when-not-use guidance, data caveats (dividends, US history start), and error conditions. The output schema likely exists, but the description also spells out the expected return object, leaving the agent with everything needed to call the tool 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 the baseline is 3, but the description adds meaningful context beyond the schema: it explains why each parameter matters (e.g., 'min_price' avoids penny stocks with example values for US$ and KRW), how 'near_high_pct' relates to tightness, and that 'rs_min' has a Minervini preference for higher values. While the field-level descriptions in the schema are already strong, the tool description enriches them with rationale and examples.

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 opens with a specific verb and resource: 'Screen KR, US and/or TW stocks that pass Mark Minervini's 8-point Trend Template.' It explicitly names the methodology, the underlying data snapshot, and the return focus ('stage-2 uptrend leaders'), making the tool's purpose unambiguous and easily distinguished from siblings like screen_technical or get_technicals.

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 'Use when' section states exactly when to apply the tool: 'finding stage-2 momentum leaders (Minervini/CAN SLIM style).' It also gives explicit exclusions: 'Don't use for a single stock's detail (get_technicals), fundamentals (screen_companies/get_valuation), or arbitrary technical signals (screen_technical).' This gives the agent clear routing guidance.

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

screen_schwartzMarty Schwartz 10-EMA + MACD Screener — approximation (FinBridge DB)A
Read-only
Inspect

Screen KR, US and/or TW stocks for a Marty Schwartz short-term momentum setup, evaluated on the nightly indicators_latest snapshot (daily corporate-action-adjusted KR prices).

APPROXIMATION: Marty Schwartz is a discretionary short-term trader; this screener only proxies his "10-day EMA green light + MACD momentum" principle. It is not his full method (which includes intraday timing, tape reading, and risk discretion). Expect false positives and misses.

Conditions (all required):

  • close > 10-day EMA (Schwartz's "green light")

  • if require_macd_bull: MACD histogram > 0 (momentum bullish)

  • RS percentile >= 'rs_min'

  • price <= 'max_ext_pct'% above the 10-day EMA (not over-extended)

Args:

  • market: 'kr', 'us', or 'all' (default)

  • rs_min: minimum RS percentile 1-99 (default 60)

  • require_macd_bull: require MACD histogram > 0 (default true)

  • max_ext_pct: max % above the 10-day EMA before over-extended (default 12)

  • min_vol_avg20: optional minimum 20-day average volume (liquidity filter)

  • min_price: optional minimum close price (avoid low-priced stocks; e.g. 10 for US$, 5000 for KRW)

  • sort_by: rs_pctile|pct_from_ema10|ret_20d|ret_5d|macd_hist|close (default rs_pctile)

  • order: 'asc'|'desc' (default 'desc'); limit: 1-50 (default 20); response_format: 'markdown'|'json'

Returns: {count, market, criteria:{rs_min, require_macd_bull, max_ext_pct}, rows:[{name, source, ticker|stock_code, as_of, close, ema10, ema20, pct_from_ema10, macd_hist, rs_pctile, ret_20d}]}.

Examples:

  • US short-term momentum, liquid: {market:'us', min_vol_avg20: 500000}

  • KR names on a fresh 10EMA green light, tight: {market:'kr', rs_min: 70, max_ext_pct: 6}

Use when: shortlisting short-term momentum names on a 10-EMA green light (Schwartz style, approximate). Don't treat a pass as a Schwartz buy — his method is discretionary. For the trend template use screen_minervini; for EMA-support leaders use screen_kell. Notes: KR/US/TW prices are adjusted for corporate actions but not dividends (indicators around dividend events may be slightly distorted); US history starts 2023-03-28 (volume from 2024-07-01) so long-window figures are shallower there. This is an approximation of a discretionary method, not a faithful reproduction. Market data, not investment advice. Errors: an empty result is not an error (count 0 = nothing passed today); 'database has not been built yet' -> ingest/indicators has not run.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax rows, 1-50 (default 20)
orderNoSort direction (default desc)desc
marketNoMarket: 'kr' (default), 'us', 'tw', or 'all'. Japan has no redistributable price source, so it is not screenable.kr
rs_minNoMinimum RS percentile (default 60)
sort_byNoSort column (default rs_pctile)rs_pctile
min_priceNoMinimum close price (avoid low-priced stocks; e.g. 10 for US$, 5000 for KRW)
max_ext_pctNoMax % above the 10-day EMA before over-extended (default 12)
min_vol_avg20NoMinimum 20-day average volume (liquidity filter)
response_formatNo'markdown' for a table, 'json' for compact machine-readable outputmarkdown
require_macd_bullNoRequire MACD histogram > 0 (default true)

Output Schema

ParametersJSON Schema
NameRequiredDescription
rowsYes
countYes
notesNo
orderNo
marketYes
signalsNo
sort_byNo
us_noteNo
criteriaNo

TDQS

A4.8/5.0
Behavior5/5

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

Annotations give readOnlyHint=true, and the description goes beyond this by disclosing that this is an approximation with false positives and misses, that prices are corporate-action-adjusted but not dividend-adjusted, that US history starts 2023-03-28, and that empty results should not be treated as errors. It also explains the 'database has not been built yet' error condition.

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 front-loaded with purpose, uses clear section headers, and is scannable with bullets. However, the Args section largely duplicates the input schema, and the approximation caveat is repeated several times. These are minor, since each section still earns its place.

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?

For a 10-parameter, 0-required-parameter tool with an output schema, the description is complete: it documents all strategy conditions, parameter semantics, output shape, examples, data quirks, error behavior, and when to route to alternative tools. There is no meaningful operational gap for an agent deciding how to invoke this 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%, so the baseline is 3. The description adds value by mapping parameters to the strategy conditions, giving concrete examples (e.g., min_price=10 for US$, 5000 for KRW; min_vol_avg20=500000), and showing how arguments combine in practice. It loses a point because the Args block mostly restates schema defaults and the market arg listing omits the 'tw' enum option that the schema supports.

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 opens with a specific verb and resource: 'Screen KR, US and/or TW stocks for a Marty Schwartz short-term momentum setup.' It names the strategy logic, the data snapshot, and the approximation nature. It also disambiguates itself from siblings by directing to screen_minervini for the trend template and screen_kell for EMA-support leaders.

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 provides an explicit 'Use when' section: short-listing short-term momentum names on a 10-EMA green light. It gives concrete exclusions ('Don't treat a pass as a Schwartz buy') and names which siblings to use instead for other strategies. It also includes practical examples for US liquid names and tight KR setups.

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

screen_technicalScreen by Technical Signals (FinBridge DB)A
Read-only
Inspect

Screen KR/US companies by technical signals over the latest indicator snapshots (v_indicators / indicators_latest, refreshed nightly). Signals and the sort key are fixed whitelists mapped to SQL predicates; every threshold is bound as a parameter, so inputs are never interpolated into SQL.

Args:

  • market: 'kr' (DART), 'us' (EDGAR), or 'all' (default)

  • signals: any of golden_cross, dead_cross, rsi_oversold (RSI<30), rsi_overbought (RSI>70), near_52w_high (within 3% of high), near_52w_low, above_sma20, volume_surge (vol_ratio>=2), macd_bullish (macd_hist>0), rs_leader (RS rating >=80 vs home market), rs_outperform (RS rating >=60). ANDed together; omit for none.

  • min_price: optional minimum close; min_vol_avg20: optional minimum 20-day average volume (liquidity filter)

  • sort_by: ret_1d|ret_5d|ret_20d|ret_60d|ret_120d|ret_250d|rsi14|vol_ratio|pct_from_52w_hi|pct_from_52w_lo|close|atr14|rs_pctile|rs_120d (default ret_20d)

  • order: 'asc'|'desc' (default 'desc'); limit: 1-100 (default 20); response_format: 'markdown'|'json'

Relative strength (rs_pctile 1-99, rs_120d) measures each stock vs its OWN national market (KR vs the KR universe, US vs the US universe): rs_pctile is the national percentile of blended 3/6/12-month momentum (IBD-style; 99=strongest); rs_120d is 6-month excess return in pp over the national median.

Returns: {count, market, signals, sort_by, order, rows:[{name, source, ticker|stock_code, as_of, close, rsi14, macd_hist, ret_5d, ret_20d, ret_60d, vol_ratio, pct_from_52w_hi, pct_from_52w_lo, golden_cross, dead_cross, above_sma20, rs_pctile, rs_120d}]}.

Examples:

  • Oversold KR names by 20-day return: {market:'kr', signals:['rsi_oversold'], sort_by:'ret_20d', order:'asc'}

  • US breakouts near highs on volume: {market:'us', signals:['near_52w_high','volume_surge'], min_vol_avg20: 1000000}

  • Strongest KR leaders vs the KOSPI/KOSDAQ universe: {market:'kr', signals:['rs_leader'], sort_by:'rs_pctile', min_vol_avg20: 100000}

Use when: ranking/filtering many companies by momentum or trend signals. Don't use for one company's detail (get_technicals) or fundamentals (screen_companies). Notes: KR/US/TW prices are adjusted for corporate actions but not dividends (indicators around dividend events may be slightly distorted); US history starts 2023-03-28 (volume from 2024-07-01) so long-window figures are shallower there. Market data, not investment advice. Errors: an empty result is not an error (count 0); 'database has not been built yet' -> ingest/indicators has not run.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax rows, 1-100 (default 20)
orderNoSort direction (default desc)desc
marketNoMarket: 'kr' (default), 'us', 'tw', or 'all'. Japan has no redistributable price source, so it is not screenable.kr
signalsNoTechnical signals to require (ANDed): golden_cross, dead_cross, rsi_oversold, rsi_overbought, near_52w_high, near_52w_low, above_sma20, volume_surge, macd_bullish, rs_leader (RS>=80), rs_outperform (RS>=60)
sort_byNoColumn to sort by (default ret_20d)ret_20d
min_priceNoMinimum close price filter
min_vol_avg20NoMinimum 20-day average volume (liquidity filter)
response_formatNo'markdown' for a table, 'json' for compact machine-readable outputmarkdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
rowsYes
countYes
notesNo
orderNo
marketYes
signalsNo
sort_byNo
us_noteNo
criteriaNo

TDQS

A5/5.0
Behavior5/5

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

With readOnlyHint already declaring the operation safe, the description adds substantial behavioral context: fixed whitelists mapped to SQL predicates with parameter-bound thresholds, nightly refresh behavior, corporate-action adjustments, US data history limits, empty-result semantics, and known error strings. This far exceeds what annotations alone 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 long but highly structured and information-dense: Args, RS explanation, Returns, Examples, Use when, Notes, and Errors each serve a distinct purpose. It is front-loaded with the core purpose and safety property, and no sentence is filler.

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?

For a tool with 8 parameters, an output schema, and several siblings, the description covers all relevant context: market scope, signal semantics, sorting, filtering, output format, use cases, exclusions, known limitations, and error behavior. An agent has everything needed to invoke it correctly without further research.

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?

Although the schema already has high coverage, the description enriches every parameter group: it defines signal thresholds, explains sort-key semantics, and describes rs_pctile/rs_120d in practical terms. The worked examples also clarify parameter combinations and expected usage patterns beyond the raw 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 action and resource: screening companies by technical signals on the latest indicator snapshots. It distinguishes itself from relevant siblings by explicitly naming get_technicals for one-company detail and screen_companies for fundamentals. The action and scope are specific and unambiguous.

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 'Use when' section explicitly says to use this tool for ranking/filtering many companies by momentum or trend signals, and directly tells the agent not to use it for one company's detail or fundamentals, even naming the alternatives. This gives clear selection criteria without requiring inference.

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

search_dart_companySearch Korean Companies (DART)A
Read-only
Inspect

Search companies registered with DART, South Korea's corporate disclosure system, by name, 6-digit stock code, or 8-digit DART corp_code. Returns the corp_code required by the other dart_* tools.

Args:

  • query: company name (Korean works best, e.g. '삼성전자'), 6-digit KRX stock code ('005930'), or 8-digit corp_code

  • listed_only: restrict to KRX-listed companies (default true). Set false to include ~90k unlisted entities.

  • limit: max results, 1-50 (default 10)

Returns: {count, companies: [{corp_code, corp_name, stock_code}]} — stock_code is null for unlisted companies. Match priority: exact stock code > exact name > listed partial > unlisted partial.

Examples:

  • {query: '삼성전자'} -> corp_code 00126380, stock_code 005930

  • {query: '카카오', listed_only: false} -> listed 카카오 plus unlisted same-name entities

Use when you need a corp_code or must disambiguate similar names. Don't use for US companies (use search_edgar_company). Errors: DART_API_KEY not configured; no match returns count 0 (not an error).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results, 1-50 (default 10)
queryYesCompany name, 6-digit stock code, or 8-digit DART corp_code
listed_onlyNoOnly KRX-listed companies (default true)

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYes
companiesYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so the description does not need to restate safety. It adds valuable behavior not in the annotations: matching priority, stock_code being null for unlisted companies, the ~90k unlisted entity scope, and error/edge-case behavior including no-match returning count 0. This exceeds baseline transparency without contradicting the 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?

Although the description is lengthy, every section earns its place: Args, Returns, Match priority, Examples, Use-when, and Errors. The structure is scannable with clear labels, and the most important scoping information is front-loaded in the first sentence.

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?

The description is complete for an agent to invoke the tool correctly: it covers input formats, output shape, match disambiguation, example usage, sibling routing, and error behavior. The presence of an output schema does not leave any critical gap, and the listed_only behavior is fully explained.

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 the parameters are already documented. The description goes beyond the schema by clarifying that query accepts a name, 6-digit KRX stock code, or 8-digit corp_code, that Korean names work best, that unlisted results have null stock_code, and that match priority favors exact codes. This adds real semantic value to the agent's 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 states a specific verb ('Search') and resource ('companies registered with DART, South Korea's corporate disclosure system'), and clearly distinguishes its search identity from the US-focused sibling search_edgar_company. It also explains the tool's key output, the corp_code required by other dart_* tools, making its role in the tool family immediately obvious.

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 says when to use the tool ('when you need a corp_code or must disambiguate similar names'), and when not to use it ('Don't use for US companies (use search_edgar_company)'). It also gives practical guidance on query forms, listing scope, and match priority, leaving no ambiguity about invocation context.

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

search_edgar_companySearch SEC EDGAR CompaniesA
Read-only
Inspect

Search SEC EDGAR registrants (US-listed companies) by ticker, company name, or CIK. Returns the 10-digit zero-padded CIK needed by the other edgar_* tools.

Args:

  • query (required): ticker ('AAPL', 'BRK-B' or 'BRK.B'), company-name fragment ('Berkshire'), or CIK number ('320193')

  • limit: max results, 1-50 (default 10)

Returns: {count, companies: [{cik, ticker, title}]} ranked exact-ticker > exact-name > prefix > substring.

Examples:

  • "find Apple's CIK" -> {query: 'AAPL'}

  • "companies named Berkshire" -> {query: 'Berkshire', limit: 5}

Use when: you need a CIK or to disambiguate a company name before calling get_edgar_financials/filings/insider_trades (those also accept tickers directly, so for an exact ticker you can skip this step). Don't use for: Korean companies (use search_dart_company) or private companies not registered with the SEC.

Errors: no match -> error suggesting a shorter name fragment; only SEC registrants with a listed ticker are searchable.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax matches to return (default 10)
queryYesTicker (e.g. 'AAPL', 'BRK-B'), company-name fragment (e.g. 'Berkshire'), or CIK number

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYes
companiesYes

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint, openWorldHint), the description discloses meaningful behavior: match ranking order, error handling for no matches, and the constraint that only SEC registrants with a listed ticker are searchable. These details let an agent predict edge cases. No contradiction with annotations exists.

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 well-structured into Args, Returns, Examples, Use when, Don't use, and Errors. Every section carries operational value, the core purpose is front-loaded, and there is no filler or redundant prose.

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?

For a 2-parameter, read-only lookup tool with an output schema, the description is complete: accepted input forms, output shape, ranking, error behavior, and routing to alternatives are all covered. An agent has everything needed to decide whether and how to call it 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?

Input schema coverage is 100%, so the baseline is 3, but the description adds value with concrete example mappings ('find Apple's CIK' -> {query: 'AAPL'}, 'companies named Berkshire' -> {query: 'Berkshire', limit: 5}), accepted ticker formats like BRK-B/BRK.B, and ranking semantics that affect result interpretation. The Args section duplicates the schema, but the examples and context push it above 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 states a specific verb and resource: 'Search SEC EDGAR registrants (US-listed companies) by ticker, company name, or CIK' and identifies the key output (the 10-digit zero-padded CIK). It clearly differentiates from sibling search_dart_company by restricting scope to US-listed SEC registrants, so an agent can distinguish it without inspecting other tools.

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 has explicit 'Use when' and 'Don't use for' sections that name exact conditions and alternatives: use it to get a CIK or disambiguate a name before get_edgar_* tools, skip it for exact tickers, and use search_dart_company for Korean companies. This is model guidance for when to invoke the tool vs alternatives.

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

search_fred_seriesSearch FRED Economic Data SeriesA
Read-only
Inspect

Search the FRED (Federal Reserve Economic Data) catalog for economic time series by keyword, ordered by popularity.

Args:

  • query: free-text search, e.g. 'consumer price index', 'unemployment rate korea', 'housing starts'

  • limit: max results 1-50 (default 10)

Returns: {count, series:[{id, title, frequency, units, seasonal_adjustment, last_updated, popularity, notes}], source}. Use the returned series 'id' (e.g. CPIAUCSL, UNRATE, DGS10) with get_fred_series.

Examples:

  • "find the US CPI series" -> {query:'consumer price index'} -> top hit CPIAUCSL

  • "KRW exchange rate series" -> {query:'korea won exchange rate'} -> DEXKOUS

  • Don't use when you already know the series ID — call get_fred_series directly.

Errors: missing FRED_API_KEY returns an error with a hint to obtain a free key.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax number of series to return (default 10)
queryYesFree-text search keywords, e.g. 'consumer price index'

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYes
seriesYes
sourceYes

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the readOnlyHint and openWorldHint annotations, the description reveals ordering behavior ('ordered by popularity'), the exact return shape, the relationship between returned IDs and get_fred_series, and the API-key failure mode. This gives the agent a realistic model of what the tool will do and return.

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 well-structured with clear sections: summary, Args, Returns, Examples, and Errors. Every sentence adds useful information, and the most important usage guidance is front-loaded. Despite its length, it remains focused and scannable.

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?

The description covers what the tool does, how to invoke it, what the response looks like, how to use the response with a sibling tool, and the primary error condition. An agent has everything it needs to decide when to call this tool and what to do with the result.

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?

The input schema already covers both parameters at 100%, so the baseline is 3. The description adds value with richer query examples ('unemployment rate korea', 'housing starts'), explains that results are ordered by popularity, and clarifies how the query maps to real-world series IDs. This goes beyond simple schema repetition.

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 identifies the tool's verb ('Search'), resource ('FRED catalog for economic time series'), and key qualifier ('by keyword, ordered by popularity'). It also distinguishes itself from get_fred_series by explaining that returned IDs should be passed to get_fred_series, so an agent can tell these siblings apart.

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 provides explicit when-to-use context: keyword-based discovery when the series ID is unknown. It also gives a direct when-not-to-use rule: if you already know the series ID, call get_fred_series instead. This is exactly the kind of guidance needed to route an agent correctly.

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. Dates show when Glama detected each change.

  1. 37 tool updates
    • First observedadd_to_watchlist
    • First observedanalyze_factors
    • First observedbacktest_portfolio
    • First observedcompare_crypto_exchanges
    • First observedcompare_financials_kr_us
    • First observedget_backtest_runs
    • First observedget_crypto_ohlcv
    • First observedget_crypto_ticker
    • First observedget_dart_filings
    • First observedget_dart_financials
    • First observedget_dart_insider_trades
    • First observedget_dart_major_events
    • First observedget_db_schema
    • First observedget_disclosure_feed
    • First observedget_edgar_13f
    • First observedget_edgar_filings
    • First observedget_edgar_financials
    • First observedget_edgar_insider_trades
    • First observedget_fred_series
    • First observedget_fred_snapshot
    • First observedget_peers
    • First observedget_portfolio
    • First observedget_stock_prices
    • First observedget_technicals
    • First observedget_valuation
    • First observedimport_portfolio
    • First observedquery_db
    • First observedscreen_canslim
    • First observedscreen_companies
    • First observedscreen_etfs
    • First observedscreen_kell
    • First observedscreen_minervini
    • First observedscreen_schwartz
    • First observedscreen_technical
    • First observedsearch_dart_company
    • First observedsearch_edgar_company
    • First observedsearch_fred_series

Frequently Asked Questions

Discussions

No comments yet. Be the first to start the discussion!

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables detection and analysis of pre-public product launches through web search, content extraction, AI-powered scoring, and automated alerting. Provides comprehensive tools for surfacing stealth startup signals before they trend publicly.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Browse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI chat clients to perform market research and competitive intelligence by gathering company overviews, competitor lists, product portfolios, pricing snapshots, and recent news via live Tavily search.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A4.2/5.0
Disambiguation4/5

Most tools have clearly distinct resource+action targets, and the overlapping screen_* tools are thoroughly cross-referenced with 'use screen_X instead' guidance. Minor ambiguity exists between get_disclosure_feed, get_dart_filings, and get_dart_major_events, which all surface KR filings from different angles but remain distinguishable.

Naming Consistency5/5

Every tool follows a consistent verb_noun snake_case pattern: get_* for retrievers, screen_* for screeners, search_* for lookups, plus action verbs like analyze_, backtest_, compare_, import_, and query_. Subfamilies (dart_*, edgar_*, fred_*, crypto_*) are consistently prefixed, making tool selection predictable.

Tool Count3/5

37 tools is heavy, and the four momentum screeners (canslim/kell/minervini/schwartz) plus three KR disclosure tools could arguably be collapsed into parameterized variants. However, the server's unusually broad scope—KR/US/TW/JP/EU equities, crypto, macro, portfolio, backtesting—means most tools earn their place, so the count is high but not chaotic.

Completeness4/5

The surface covers the core workflow well: search, prices, fundamentals, filings, insider trades, valuation, screeners, backtesting, and portfolio tracking for KR/US, plus crypto and macro. Notable gaps are the lack of single-company financial-statement tools for TW/JP/EU (only available through screen_companies) and no real-time stock quotes, but these are workable for the stated local-database research purpose.

Resources