Skip to main content
Glama

FinBridge

Server Details

Korean stock research MCP: DART financials, global filings, daily prices and research tools.

Ownership verified
Status
Healthy
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
Jakechj/finbridge-mcp
GitHub Stars
0

TDQS

A4.4/5.0

Scored across 25 tools

Disambiguation4/5

Most tools map to a distinct resource/action (filings, financials, insider trades, prices, valuation, portfolio, watchlist), and the KR/US source prefixes make selection clear. The main overlap is among get_dart_filings, get_dart_major_events, and get_disclosure_feed, but their 'not for' guidance and filtering differences keep them mostly separable.

Naming Consistency5/5

Every tool name follows an imperative verb_noun pattern, with consistent source prefixes (get_dart_*, get_edgar_*, search_*_company) and portfolio/watchlist verbs (get/import/manage/restore). There is no camelCase/snake_case mixing or vague generic verbs, so the naming is highly predictable.

Tool Count4/5

25 tools is on the heavy side, but the server's scope is broad: KR/US/TW regulatory data, normalized financials, insider activity, prices, valuation, peers, portfolio/watchlist, and SQL access. Each tool handles a specific job with little duplication, so the count feels slightly over-scoped rather than bloated.

Completeness3/5

Core workflows (search -> filings -> financials -> insider trades -> valuation, plus portfolio/watchlist) are well covered. However, descriptions repeatedly reference tools that are not in this set (screen_companies, get_crypto_ticker/get_crypto_ohlcv), leaving no direct screening or crypto-market tool; query_db can partially substitute for screening but not for live crypto.

Available Tools

25 tools
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 Federal Reserve H.10 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.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=true, so safety is covered. The description adds genuine behavioral context beyond that: the FX conversion methodology, the accounting-basis mismatch caveat, and the per-metric/per-year row shape of the response. Not fully exhaustive (no mention of rate limits or caching), but substantial added value.

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?

Front-loaded with the core purpose, then structured Args/Returns/Examples/Errors sections. There is mild redundancy between the Args block and the already-complete schema descriptions, but the examples and error guidance earn their space.

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?

An output schema exists, so return-value explanation is not required, yet the description still summarizes the row shape and the FX/caveat payload. Combined with explicit error handling and usage exclusions, nothing an agent needs to call this correctly is missing.

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 the schema already documents each parameter including accepted identifier formats and the metrics enum. The Args block restates these with examples but adds no semantics the schema lacks. Baseline 3 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?

States a specific verb (compare), the exact resources (annual financial statements of a Korean and a US listed company), the data sources (OpenDART/K-IFRS and SEC EDGAR/US-GAAP), and the normalization applied (KRW→USD via Fed H.10 rates). This clearly separates it from the single-market siblings get_dart_financials and get_edgar_financials.

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?

Gives explicit exclusions ('Don't use for quarterly data (annual only) or non-KR/US companies') and routes the agent to fallback tools (search_dart_company / search_edgar_company) when a name is unknown. The example query also shows a realistic invocation condition.

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

get_dart_documentExplore Korean Disclosure Document (DART)A
Read-only
Inspect

Explore the primary body of one DART filing by receipt number while preserving section and table structure.

Use get_dart_filings first to obtain rcept_no. Start with action='overview', then select a section or table instead of requesting a long flattened filing.

Args:

  • rcept_no: 14-digit DART receipt number

  • action: overview (default) | section | table | compare_tables | compare_sections

  • compare_rcept_no and compare_index: second filing and its selected table/section index for comparison; table_index/section_index selects the first. Use both overviews first. Only selected content is compared, not entire filings.

  • section_index or section_query: one section selector for action='section'

  • table_index: 1-based table selector for action='table'

  • max_chars: section text cap, 1,000-100,000 (default 30,000)

  • max_rows/max_columns: selected table caps (defaults 50/30)

  • overview_offset/overview_limit: paginate both section and table summaries with the same 0-based slice (defaults 0/20, max 100)

  • response_format: markdown or json

Returns source evidence for the OpenDART document entry and character range. Tables retain row/column order, cell text, rowspan/colspan and nearby reported unit labels. Zero and negative strings are not discarded. Separate HWP/PDF attachments are not fetched or rehosted.

This tool does not claim an XBRL presentation/calculation hierarchy. Use get_dart_financials for normalized figures, reported account groups and known statement sum checks.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionNoStart with the outline, then select a section or a leaf table.overview
max_rowsNoMaximum selected table rows; original row count is retained.
rcept_noYes14-digit DART receipt number from get_dart_filings
max_charsNoMaximum characters of selected section text; truncation is explicit.
max_columnsNoMaximum selected table columns; original column count is retained.
table_indexNo1-based leaf-table number; required for table action.
compare_indexNo
section_indexNo1-based section number from the outline; use only with section action.
section_queryNoSection title search; use instead of section_index. Ambiguous matches are rejected.
overview_limitNoMaximum section and table summaries per outline page; follow next_offset.
overview_offsetNo0-based outline slice offset for both sections and tables.
response_formatNoReadable markdown or JSON; both retain structured content.markdown
compare_rcept_noNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
notesNo
tableNo
actionYes
tablesNo
sectionNo
overviewNo
sectionsNo
comparisonNo
preservationNo
source_evidenceYes

TDQS

A4.8/5.0
Behavior5/5

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

The description adds substantial behavior beyond the readOnly/openWorld/destructive annotations: preserving table order, rowspan/colspan, unit labels, not discarding zero/negative strings, not fetching HWP/PDF attachments, and explicitly not claiming an XBRL hierarchy. This gives an agent accurate expectations about scope and limitations.

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 the tool has 13 parameters and multiple action modes, so the extra length is justified. It is front-loaded with the core purpose and workflow, and the Args section is structured and readable, though some parameter-level detail overlaps with the 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?

Given the tool's complexity, an output schema, and rich annotations, the description is complete: it covers the recommended workflow, comparison flow, truncation/pagination caps, structured-content guarantees, and exclusions. An agent has enough context to invoke it correctly without guessing.

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 high at 85%, but the description adds meaning for the comparison parameters, explaining compare_rcept_no and compare_index as selecting a second filing and index, and advising to use both overviews first. It also clarifies ambiguous section_query rejection and pagination behavior beyond the schema's terse field docs.

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: 'Explore the primary body of one DART filing by receipt number while preserving section and table structure.' It also differentiates itself from siblings by prescribing get_dart_filings for obtaining the receipt number and get_dart_financials for normalized financial figures, so an agent can tell this tool 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?

Usage guidance is explicit and actionable: 'Use get_dart_filings first to obtain rcept_no,' 'Start with action="overview",' then select a section or table instead of requesting a long flattened filing. It also names the alternative for financial normalization, clarifying when not to use this tool.

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.

Not this tool for: US filings (get_edgar_filings), a cross-market feed already stored here (get_disclosure_feed), or major-event reports specifically (get_dart_major_events, a narrower slice of this one).

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. Pass rcept_no to get_dart_document to explore its primary body by outline, section, or table.

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.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, but the description adds meaningful context: report names are in Korean, errors reveal DART status 013 and remedies, the return shape is given, and the agent is routed to get_dart_document with rcept_no. It also warns about the 90-day default and pagination. That is far good beyond the thumbnail-protected 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 extremely well-structured: purpose first, then exclusions, then args, examples, return shape, error guidance, and a final routing hint. The only slack is that get_dart_major_events is mentioned both in the 'not this tool' list and in the closing sentence, but even that adds the keyword-filtering nuance. Overall it 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 6‑parameter tool with a separate search and document tools, the description covers every needed decision: defaults, formats, type codes with Korean labels, example calls, return object shape, pagination, error conditions with remedies, and a pointer to get_dart_document. It leaves no gap that would force the agent to introspect blindly.

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 real meaning: corps such as Korean names, 6-digit codes, or 8-digit DART corporates; it explicitly says omitting the filter gives a market-wide list; it gives each type code (A–J) with Korean labels and the underlying category. The description explains defaults for from/to and pagination limits. This is added value beyond the bare 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?

First sentence uses a specific verb and resource: 'List corporate disclosure filings from DART', with optional filters. It then names alternatives (get_edgar_filings, get_disclosure_feed, get_dart_major_events), which makes it unambiguous which sibling it is not. The purpose is fully disambiguated.

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 'Not this tool for: ...' and lists three sibling tools with the conditions that select them. It also ends with 'For major events with keyword filtering use get_dart_major_events.' Examples show typical calls. Nothing is left to inference.

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.

Not this tool for: US statements (get_edgar_financials), a KR-vs-US pair on one screen (compare_financials_kr_us), or ranking many companies at once (screen_companies, which reads the stored table and covers KR/US/TW/JP/EU). This tool requests one Korean company's statements through the DART adapter; results may be reused from a process-local cache for up to 24 hours. data_as_of.generated_at is response creation time, not source retrieval time. Peer comparisons use separately dated database snapshots.

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.

  • statement: optional BS/IS/CIS/CF/SCE account-group filter

  • account_query: optional case-insensitive account name or account_id substring

  • account_limit: returned account rows, 1-200 (default 40)

  • as_of: optional YYYY-MM-DD. Adds point_in_time: the version of this period/basis that was public on that day.

  • 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: selected reported statement rows with statement, account id/detail, reported order, currency, current and previous amounts.

  • statement_groups: counts and reported order ranges by BS/IS/CIS/CF/SCE. These are flat DART groups, not an inferred XBRL hierarchy.

  • sum_checks: known balance-sheet equations with pass/fail/not_tested, operands, currency, tolerance and receipt-number evidence.

  • preserved_revisions: bounded numeric filing versions for the exact database company, requested period and actual statement basis. Includes provider, metric units, publication-day evidence, latest observation, unknown first-seen state, and explicit comparison uncertainty.

  • revision_links: original filing <-> amendment filings for this period/basis, linked only by DART report names ([기재정정]/[첨부정정] prefix, same title, one original, later receipt numbers). restated_items lists each metric whose value changed with original_value, amended_value, both receipt numbers, both publication dates and both DART URLs. Exact 1,000^k ratios are flagged as suspected unit errors, not restatements. Unlinkable cases return a reason instead of a guess.

  • point_in_time (only with as_of): the last preserved version with publication_date <= as_of (no look-ahead; latest-value fallback is never used). status found | uncertain (an amendment public by as_of has no preserved values) | not_yet_filed | original_not_preserved | no_versions | unavailable.

  • earnings_disclosures (only when stored filings exist for this period): figures the company itself disclosed, next to its periodic-report figures. preliminary_vs_reported = the last 영업(잠정)실적 filing published on or before the periodic report vs that report's original values (difference, difference_pct, within_rounding = within half the preliminary table's unit; window_ambiguous/scale_suspect assert nothing), with every preliminary version, its amendment link (only when exactly one earlier original exists) and unreadable filings. outlook_vs_reported = single-number items from 영업실적등에대한전망/장래사업ㆍ경영계획 for this exact period with achievement_pct = reported ÷ disclosed × 100, or a status explaining why nothing is computed (basis_not_stated, definition_may_differ, period_not_reported_directly …). history = counts of those filings and their amendments since recorded_from. Facts only — no forecast, estimate or recommendation.

Examples:

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

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

  • {corp: '010130', year: 2024, as_of: '2025-06-30'} -> FY2024 as known on 2025-06-30 (before the 2026-08-13 amendment)

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).
as_ofNoOptional YYYY-MM-DD. Return point_in_time: the preserved version of this period that was public on that day.
reportNoReport type: annual(사업보고서) | q1(1분기) | half(반기) | q3(3분기). Default annual.annual
statementNoOptional statement-group filter.
account_limitNoMaximum returned account rows (default 40).
account_queryNoOptional account name/account_id substring.
response_formatNo'markdown' for tables, 'json' for compact machine-readable outputmarkdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
accountsNo
data_as_ofNo
normalizedYes
plan_limitNo
sum_checksNo
point_in_timeNo
revision_linksNo
peer_comparisonNo
statement_groupsNo
account_selectionNo
preserved_revisionsNo
earnings_disclosuresNo

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already establish readOnly, openWorld, and non-destructive behavior, but the description adds substantial operational context: 24-hour cache reuse, response creation time vs source retrieval time, automatic consolidated-to-separate fallback, no-look-ahead point-in-time semantics, revision linking rules, and earnings disclosure handling. These are meaningful behavioral traits beyond the structured hints.

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 definition is front-loaded with purpose and exclusions, then organized into Args, Returns, Examples, and Errors. It is very long and repeats some schema parameter details, but most of the detail earns its place given the tool's complexity and the subtle financial semantics involved.

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 nine-parameter financial data tool with an output schema, the description is exceptionally complete. It covers purpose, alternatives, parameter behavior, return semantics, edge cases, revision handling, point-in-time behavior, and error recovery.

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 does add useful meaning beyond the schema, including filing timing, automatic fs fallback behavior, case-insensitive account querying, and the no-look-ahead semantics of as_of, though much of the Args section still mirrors 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 and normalize financial statements of a Korean company from OpenDART. It also names the function (fnlttSinglAcntAll) and explicitly distinguishes the tool from sibling tools like get_edgar_financials, compare_financials_kr_us, and screen_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?

Provides explicit when-to-use and when-not-to-use guidance, naming alternatives for US statements, KR-vs-US comparison, bulk screening, and filing text. It also gives error handling guidance and examples for common query patterns.

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.

Not this tool for: US insiders (get_edgar_insider_trades) or institutional managers, which are a different kind of holder entirely (get_edgar_13f).

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?

Beyond the readOnly/destructive annotations, the description discloses important behavior: there is no transaction price in KR reports, reports are filed within ~5 business days, buy/sell is derived from the sign of share change, a filter with no matches returns count 0 rather than an error, and summary totals cover the entire fetched set regardless of the filter. These are exactly the non-obvious behaviors an agent needs.

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 organized into labeled sections (purpose, not-for, args, returns, important, examples, use-when, errors), with the core purpose and sibling differentiation front-loaded. The length is justified by the tool's complexity and every block carries actionable information; only minor repetition of sibling routing exists.

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 moderately complex lookup tool with an output schema and 4 parameters, the description covers input formats, enum semantics, return shape, edge cases (no matches, unknown company), timing, and the no-price caveat. Nothing an agent needs to invoke it correctly is left out.

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, and the description adds meaningful value on top: company can be a 6-digit code, name, or 8-digit DART corp_code; tx_type is tied to positive/negative share change; and response_format choices are mapped to markdown table vs machine-readable JSON. It mostly reinforces the schema but with richer operational meaning.

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: 'Korean insider transactions for a listed KR company' from DART's elestock report, explicitly framed as the Korean equivalent of SEC Form 4. It also distinguishes itself from sibling tools by naming get_edgar_insider_trades and get_edgar_13f as covering US insiders and institutional managers, so an agent can select it correctly.

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 routing: 'Not this tool for: US insiders... or institutional managers', then repeats the alternatives in the 'Use when' section ('For US insiders use get_edgar_insider_trades. For institutional holdings use get_edgar_13f'). It also gives an error-handling path (unknown company -> search_dart_company), 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.

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.

Not this tool for: the full disclosure list or other report categories (get_dart_filings — periodic reports, securities issuance, ownership, KRX notices), US 8-K events (get_edgar_filings), or the cross-market stored feed (get_disclosure_feed). What this adds over get_dart_filings type='B': a 'kinds' regex over Korean report names (e.g. '증자|합병|전환사채'), a 180-day default window tuned for event scans, and matched-count totals — so use it when the question is 'which companies announced X', not 'what did company Y file'.

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 when: event-driven screening (rights offerings, mergers, CBs, treasury stock, lawsuits) market-wide or for one company. For every filing category, or when you already know the report you want, 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

A4.9/5.0
Behavior5/5

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

Annotations already provide readOnlyHint=true and destructiveHint=false, so the safety profile is clear. The description adds valuable behavioral context beyond the annotations: filtering is applied client-side over the most recent 100 events, the default window is 180 days, the return shape is identical to get_dart_filings, and error conditions are documented (no events in range -> widen dates; invalid regex; unknown company -> search_dart_company). These details let the agent anticipate behavior and handle failures, going well 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.

Conciseness5/5

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

The description is long but meticulously structured: it front-loads purpose and differentiators, then flows through 'Not this tool', 'What this adds', Args, Returns, Examples, Use when, and Errors. Every sentence earns its place; there is no filler or repetition of schema content. The use of sections and bullet-like formatting makes it scannable despite its length, and the most critical routing information appears first.

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 has a rich output schema (indicated as present) and a complex sibling landscape. The description covers all necessary aspects: purpose, differentiation, parameter semantics, return shape (explicitly matching get_dart_filings), default behavior, examples, and error handling. An agent can confidently select and invoke this tool correctly without needing additional documentation. No gaps are apparent.

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 meaningful extra semantics: it explains that 'kinds' is a JavaScript regex matched against Korean report names and provides concrete examples ('증자|합병|전환사채'), clarifies the default date window (180 days), and gives full usage examples for corp, kinds, from/to. It also documents the limit range (1-100). These additions go beyond the schema descriptions, though not exhaustively (e.g., no explicit mention that 'corp' can be omitted for market-wide scans appears in the description and schema both). The extra examples and filtering behavior justify a 4.

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

Purpose5/5

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

The description states the specific verb ('List') and resource ('major-event disclosures, DART type B') and enumerates concrete event types (capital increases, mergers, convertible bonds, treasury stock, bankruptcy, lawsuits). It also explicitly names sibling tools it is not, distinguishing it from get_dart_filings, get_edgar_filings, and get_disclosure_feed. An agent can instantly tell what this tool does and how it differs from its peers.

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 and when-not-to-use guidance. It opens with 'Not this tool for:' and lists alternatives for full filings, US 8-K, and cross-market feeds. It further explains what it adds over get_dart_filings (regex filter, 180-day default window, matched-count totals) and ends with 'Use when: event-driven screening...' plus an explicit 'For every filing category... use get_dart_filings.' This is textbook routing guidance.

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 (counted in the background and refreshed every 30 minutes; null with rows_note "counting…" right after a server start), and ready-to-run example queries for query_db.

Read this before writing a query_db statement. It returns no company data itself — get_db_schema describes the tables, query_db runs the SELECT.

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 market data itself (get_stock_prices / get_valuation / the screeners read the same tables with the right joins already done). FinBridge has no real-time equity quote tool — equity prices here are end-of-day closes from the nightly ingest; the only live data is crypto (get_crypto_ticker) and regulator filings (get_dart_filings / get_edgar_filings). 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
rows_noteNo

TDQS

A4.6/5.0
Behavior5/5

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

The description goes beyond the readOnlyHint annotation by explaining behavioral nuances: row counts are refreshed every 30 minutes, may show 'counting…' immediately after a server start, and that it returns no company data itself. It also discloses potential error messages and the meaning of 'database has not been built yet.'

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-organized, with clear sections for key objects, examples, usage, and errors. It front-loads the main purpose and provides essential context for the read-only nature. It is slightly verbose but all content is relevant and helpful.

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 that the tool has no parameters, the description is very complete. It specifies the return structure, explains the key tables and views, gives example use cases, and lists error conditions. It fully prepares an agent to call the tool and interpret results.

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?

The tool has no parameters, and the schema declares an empty object, so there is nothing to clarify. The description explicitly states 'Args: (none)', which is redundant but harmless. Per the rubric, with high schema coverage and no parameters, a baseline score of 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool inspects the schema of the local finbridge database, enumerating tables, views, columns, row counts, and example queries. It explicitly distinguishes itself from query_db by stating 'get_db_schema describes the tables, query_db runs the SELECT.'

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 when-to-use guidance: 'Use when: preparing a query_db, or checking ingest coverage.' It also names what not to use it for and points to alternative tools like get_stock_prices and the screeners, which is excellent orientation.

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.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds meaningful context: 'refreshed nightly + intraday for KR', 'Filing metadata only; bodies are at the linked source URLs', and error handling ('empty result is not an error'). This goes beyond annotations without contradicting them, though it doesn't exhaustively detail all behaviors.

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: purpose first, then Args, Returns, Examples, Use/Don't use, Notes, Errors. Every section earns its place, with no fluff. Front-loaded with the core purpose and scoping, making it easy for an agent to quickly grasp the tool's role and call it correctly.

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 9 optional parameters, interactions, and an output schema, the description covers everything an agent needs: return format, filtering semantics, examples, usage guidance, and error handling. It also differentiates from numerous siblings. No critical gaps remain 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 schema documents each parameter. However, the description adds valuable interactions: material_only default behavior (8-K / KR type-B), forms overriding material_only, and days vs from/to precedence. Examples illustrate parameter combinations, enhancing the agent's ability to use them correctly beyond 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?

The description states a specific verb+resource: 'Recent regulatory disclosures from the local finbridge database (filings table)'. It clearly distinguishes itself as a unified feed across KR and US markets, and explicitly contrasts with sibling tools like get_dart_filings / get_edgar_filings by positioning as a faster-than-news primary source focused on material events.

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

Usage Guidelines5/5

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

Explicitly states 'Use when: scanning for catalysts / breaking corporate events, or one company's recent filings' and 'Don't use for filing BODIES (open the url) or for financial statement values (get_dart_financials / get_edgar_financials / query_db)'. Names alternative tools and provides clear conditions, leaving nothing to inference.

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

Quarter-end institutional manager holdings reconstructed from SEC 13F-HR and 13F-HR/A (RESTATEMENT or NEW HOLDINGS), for the latest reportDate in recent submissions. Pass a manager name or CIK, not an issuer ticker. top=1–50 (default 20) limits displayed rows. response_format=markdown or json.

Returns reported security rows with separate class, PUT/CALL, SH/PRN, discretion and other-manager fields; no ticker mapping or reverse ownership lookup. Values normalize each filing to USD using the 2023-01-03 filing-date boundary. Missing numbers stay null. Duplicate/shared reporting, incomplete amendment chains and confidential omissions withhold totals/weights. sources carries accession, primary/table URLs, report/filed/acceptance/fetch times and amendment evidence.

prior_period is a distinct reportDate; no prior omits changes. Unverified corporate actions, missing rows, options/principal and incomplete reports withhold change signals with explicit comparison_exclusions. Empty changes does not establish no activity. 13F covers disclosed Section 13(f) positions, not a complete/current portfolio; 45 days is a filing deadline, not a freshness guarantee. Not investment advice.

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
changesNo
sourcesYes
holdingsYes
value_unitNo
total_valueNo
generated_atNo
num_holdingsNo
prior_periodNo
prior_sourcesNo
index_warningsYes
comparison_statusNo
calculation_versionNo
comparison_exclusionsYes
reconstruction_statusNo
prior_reconstruction_statusNo

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/openWorldHint annotations by disclosing normalization details (2023-01-03 filing-date boundary), null handling, withheld totals/weights for incomplete data, amendment evidence, and the 45-day filing deadline caveat. It also warns that empty changes does not establish no activity, which is critical behavioral context.

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

Conciseness4/5

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

The description is dense but well-organized, front-loading the core purpose and then covering caveats. It is longer than ideal, but every sentence carries meaningful behavioral or usage information. The structure is logical: purpose, parameters, return details, limitations.

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 (13F data, amendments, normalization, exclusions), the description is remarkably complete. It covers input requirements, output contents, edge cases, and limitations. The output schema exists, so return values don't need to be spelled out, but the description still explains the sources and changes fields.

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 documents all three parameters. The description adds value by explaining the filer parameter accepts either a name or CIK, and by clarifying the top parameter limits displayed rows. It doesn't add much beyond the schema, but the filer clarification is genuinely useful.

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 reconstructs quarter-end institutional manager holdings from SEC 13F filings, and explicitly distinguishes it from issuer-ticker lookups. It names the resource (SEC 13F-HR filings) and the specific verb (get/reconstruct), making it easy to differentiate from siblings like get_edgar_filings or get_edgar_financials.

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 to pass a manager name or CIK, not an issuer ticker, and explains the top parameter range and response_format options. It also clarifies what the tool does not do (no ticker mapping, no reverse ownership lookup), which helps an agent decide when to use it versus alternatives.

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.

Not this tool for: Korean filings (get_dart_filings) or a cross-market feed already stored here (get_disclosure_feed).

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

A5/5.0
Behavior5/5

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

The description is transparent about read-only behavior, coverage limits (~1000 filings per company), error handling, and the fact that it only returns metadata/URLs and does not fetch full documents. This aligns perfectly with the readOnlyHint and destructiveHint 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 clear sections for purpose, examples, usage boundaries, and errors. It is detailed but every sentence adds value, and the included examples improve clarity without 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, schema, and output schema together provide complete context: parameters, return shape, coverage limits, error handling, and disambiguation from sibling tools. No critical information is missing for an agent to invoke 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?

The schema covers 100% of parameters with meaningful descriptions, and the tool description further clarifies company formats, form-type filtering, date range syntax, and limit defaults. Examples make parameter usage concrete.

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

Purpose5/5

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

The description clearly states that the tool lists a US company's recent SEC filings from EDGAR, returns metadata and document URLs, and does not download contents. It also distinguishes itself from sibling tools like get_dart_filings and get_disclosure_feed.

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 cases, examples, and a 'Use when' / 'Don't use for' section that clearly scopes the tool. It also explains likely errors and empty results, giving strong practical guidance.

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.

Not this tool for: Korean statements (get_dart_financials), a KR-vs-US pair on one screen (compare_financials_kr_us), or ranking many companies at once (screen_companies, which reads the stored table and covers KR/US/TW/JP/EU). This tool requests one US company's SEC XBRL company facts through the source adapter; results may be reused from a process-local cache for up to 24 hours. data_as_of.generated_at is response creation time, not source retrieval time. Peer comparisons use separately dated database snapshots.

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
notesNo
companyYes
periodsYes
data_as_ofNo
plan_limitNo
peer_comparisonNo

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is covered. The description goes beyond this by disclosing caching behavior ('results may be reused from a process-local cache for up to 24 hours'), the meaning of data_as_of.generated_at (response creation time, not source retrieval time), and the fact that peer comparisons use separately dated snapshots. It also explains the ordering of periods and the special case that Q4 is not reported separately in quarterly mode. All of this adds significant behavioral context that annotations alone do not 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 well-structured and front-loaded. It leads with the core purpose, then addresses exclusions, parameter details, return structure, examples, and error handling in a logical order. Every sentence earns its place: no fluff, no repetition. Despite being lengthy, it remains efficient because each piece of information is actionable for an agent.

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 (5 parameters, output schema, multiple sibling tools), the description is remarkably complete. It explains the return structure (NormalizedFinancials with company, basis, periods, notes), specifies that periods are most-recent first and fiscal_year is the calendar year of the period end, and details error scenarios (unknown company -> use search_edgar_company; unsupported filers). With an output schema present, the description needn't fully repeat return values, but it does provide enough context for correct invocation and interpretation.

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 meaningful semantics beyond the schema: it explains that 'quarterly' means discrete Q1-Q3 from 10-Q filings and that Q4 is not reported separately, clarifies that values are raw USD and eps_diluted is per share, and gives concrete examples mapping natural language to parameters ('Apple's revenue and net income for the last 3 years' -> {company:'AAPL', metrics:['revenue','net_income']}). This goes beyond the schema's terse parameter descriptions, earning a 4.

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

Purpose5/5

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

The description opens with a precise statement of what the tool does: 'Normalized annual (10-K) or quarterly (10-Q) financial statements for a US company, from SEC EDGAR XBRL company facts (US-GAAP).' This names the verb (get), the resource (financial statements), the source (SEC EDGAR XBRL), and the geographic scope (US). It also explicitly distinguishes itself from siblings like get_dart_financials, compare_financials_kr_us, and screen_companies, making the purpose unambiguous even without reading 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 description provides explicit when-to-use and when-not-to-use guidance. It lists specific alternatives ('Not this tool for: Korean statements (get_dart_financials), a KR-vs-US pair on one screen (compare_financials_kr_us), or ranking many companies at once (screen_companies)') and a dedicated 'Use when' / 'Don't use for' section. This leaves no doubt about selection criteria, including the unsupported case of IFRS 20-F filers.

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.

Not this tool for: Korean insiders (get_dart_insider_trades) or institutional managers, which are a different kind of holder entirely (get_edgar_13f).

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

A5/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 behaviors: summary totals cover the whole fetched window regardless of filter, unparseable XMLs are skipped and counted in notes, and a filter with no matches returns count 0 (not an error). This is valuable for expectation-setting.

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 (main purpose, exclusions, filter explanation, args, returns, examples, usage, errors). It is thorough but not verbose, using bullet-like sections and staying concise while covering all necessary information. The main purpose 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 includes a detailed 'Returns' section that acts as an output schema, explaining the structure of the result including summary, trades array, and notes. It also covers error handling and edge cases, making the tool's behavior fully predictable for an agent.

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?

All three parameters are described in the schema, and the description adds further meaning: it explains transaction codes (P, S, M, F, A, G), acquired_or_disposed values, and clarifies that 'limit' is the number of filings parsed. The examples also map user intents to parameter 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 clearly states the tool fetches latest insider transactions for a US company from SEC Form 4 filings, with a buy/sell summary and optional filter. It distinguishes from get_dart_insider_trades and get_edgar_13f by explicitly noting the US scope and the focus on Form 4 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?

Provides explicit 'Use when' and 'Don't use for' sections, naming alternatives like get_edgar_13f for institutional holdings and get_dart_insider_trades for Korean companies. Includes concrete examples and clarifies the effect of the limit parameter, making selection straightforward.

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 references for one company across KR / US / TW / JP / EU. The default uses a sourced business theme or broad source classification and does not assert direct competition or add unrelated companies to fill the limit. Explicit rank='size' returns same-currency size references and does not assert an industry relationship. Also returns the company's business-segment revenue split where available (Japan from 有価証券報告書 XBRL, the US from SEC DERA financial-statement datasets; US segment names are usually end markets, not industries) — informational unless rank='segments'.

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'|'eu' (optional) — disambiguates codes/names shared across markets (TW and JP both use 4-digit codes; 'eu' companies are addressed by ISIN).

  • 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 omitted = business-related references; 'size' = explicit size references with verified equal market-cap currency; '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 normalized 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: existing fields plus policy_version, purpose, insufficiency_reason; each peer also has selection_reason, comparison_role and evidence_status. Broad/theme rows are business-related references, not verified direct competitors. Explicit size rows are size-reference only.

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: curated business themes remain separate from official company-level classifications. Segment names may be geographic (Japan/Asia/USA) when a company defines its reportable segments by region. Unverified cross-currency absolute market-cap ordering is never used. Errors: unknown/ambiguous company -> candidate list; no classification -> basis_kind='size' with a note.

ParametersJSON Schema
NameRequiredDescriptionDefault
rankNoOmit for business-related references; 'size' explicitly requests same-currency size references; 'segments' uses business-mix similarity
limitNoPeers to return (default 5)
marketNoRestrict resolution to one market ('eu' = ESEF filers, identified by ISIN)
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
as_ofNo
basisNo
notesNo
peersYes
sectorNo
companyYes
segmentsNo
data_as_ofNo
industry_mixNo

TDQS

A5/5.0
Behavior5/5

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

Annotations already mark the tool as readOnlyHint=true and destructiveHint=false. The description adds substantial behavioral context: it does not assert direct competition, does not fill limits with unrelated companies, the rank='size' mode is explicitly size-reference only, and segment splits are informational unless rank='segments'. It also notes that unverified cross-currency absolute market-cap ordering is never used. This goes far beyond the annotations and clarifies 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.

Conciseness5/5

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

Although long, the description is structured into Args, Returns, Examples, Use when, Notes, and Errors sections. Every sentence adds value—no filler. The opening sentence states the core purpose immediately, and the structure allows an agent to quickly find relevant details. The length is justified given the tool's complexity.

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 return structure (policy_version, purpose, insufficiency_reason, plus per-peer selection_reason, comparison_role, evidence_status) and error behavior (unknown/ambiguous company -> candidate list; no classification -> basis_kind='size'). It also includes nuanced notes about segment names and curated themes. With a comprehensive output schema and rich description, 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% (every parameter has a description), but the tool description adds significant extra meaning: it explains how market disambiguates shared codes (TW/JP 4-digit), what same_market_only affects (cross-market peers allowed by default), the semantics of rank='segments' with cosine similarity and tie-breaking, and the default of limit=5. It also clarifies response_format defaults. This is far more than the schema alone provides.

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

Purpose5/5

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

The description opens with a precise purpose: 'Comparison references for one company across KR / US / TW / JP / EU.' It explicitly distinguishes itself from siblings by stating 'Don't use for strategy screens (screen_*) or for full financial statements (get_dart_financials / get_edgar_financials)' and names alternatives. The verb+resource is clear, and the differing ranking modes (business-related, size, segments) make the tool's scope 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 includes an explicit 'Use when' section: 'building a comparison table or choosing competitors for a financial comparison.' It then lists exclusions ('Don't use for strategy screens (screen_*) or for full financial statements (get_dart_financials / get_edgar_financials)'). This gives the agent both positive and negative routing guidance, which is ideal.

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 holdings this user has already registered in FinBridge with import_portfolio — listed stocks plus cash, crypto, ETF and physical assets — valued at the latest prices, with return and asset allocation. A user who has registered nothing gets an empty list.

Not this tool for: analysing or valuing a company (get_valuation), prices (get_stock_prices), or finding companies (screen_companies). It reads only what this user stored, so it knows nothing about a company they do not hold.

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 an ECB-derived USD/KRW rate.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
errorNo
notesNo
combinedNo
holdingsNo
allocationNo
total_valueNo

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 adds valuable behavioral context beyond that: pricing sources differ per asset class (live ccxt quotes for crypto/ETFs, latest database closes for stocks, registered amount for cash and physical assets), allocation is aggregated per currency, and combined totals convert to KRW via an ECB-derived USD/KRW rate. This gives the agent a clear model of side effects, dependencies, 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.

Conciseness5/5

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

The description is well structured: main purpose is front-loaded, followed by empty-case behavior, explicit alternatives, and then helpful technical details. Every sentence carries meaningful information, and there is no fluff or repetition.

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 no parameters, the description covers all necessary invocation context: what is returned, how values are sourced, under what conditions it returns an empty list, and which sibling tools should be used instead. No critical gap 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?

The tool has zero parameters and an empty input schema, so there are no parameter semantics to add. The no-parameters baseline is 4, and the description does not need to explain anything more for invocation.

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 exactly what the tool does with a specific verb and resource: 'Return the holdings this user has already registered in FinBridge with import_portfolio', listing all asset types and valuation aspects. It also explicitly distinguishes itself from sibling tools by naming get_valuation, get_stock_prices, and screen_companies as what it is not for.

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 unambiguous when-to-use and when-not-to-use guidance by naming the alternatives ('Not this tool for: analysing or valuing a company (get_valuation), prices (get_stock_prices), or finding companies (screen_companies)') and states the limiting condition that it only reads what the user stored. The empty-list case is also explicitly handled.

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

get_portfolio_historyPortfolio Import HistoryA
Read-onlyIdempotent
Inspect

List the append-only portfolio snapshots recorded for this user. Each import_portfolio call that actually changes the stored holdings/assets (and each restore_portfolio_snapshot) appends one snapshot of the whole portfolio at that moment — quantities, average prices, symbols and asset classes, never market prices or computed valuations (those are recomputed fresh whenever needed). Identical resubmissions do not create a duplicate entry. Use this to see when the portfolio changed, then restore_portfolio_snapshot to undo a bad import.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax snapshots to return, most recent first. Default 20.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
errorNo
snapshotsNo

TDQS

A4.4/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing append-only semantics, the exact trigger conditions for a new entry (import_portfolio only when holdings/assets actually change, plus each restore), the dedup rule for identical resubmissions, and precisely what is and is not captured. These are behavioral facts the readOnly/idempotent hints cannot 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?

Three sentences, front-loaded with the core definition before the trigger rules and the recovery hint. Information density is high, though the parenthetical about valuations being recomputed is slightly tangential and the sentences are long.

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?

An output schema exists, so return values need not be described; the description instead covers everything else an agent needs — snapshot contents, creation triggers, dedup behavior, and the undo path. 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.

Parameters3/5

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

Schema description coverage is 100% and the single 'limit' parameter (min 1, max 100, default 20, most recent first) is fully documented in the schema. The description adds no parameter-level detail, which is acceptable here but earns only 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?

States a specific verb (list) and resource (append-only portfolio snapshots) and immediately defines what a snapshot is: whole-portfolio quantities, average prices, symbols and asset classes at a moment in time. It also distinguishes itself from computed data by noting market prices/valuations are never stored, which separates it from get_portfolio/analyze-style 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?

Explicitly says when to use it ('to see when the portfolio changed') and names the follow-on action restore_portfolio_snapshot for undoing a bad import. It does not, however, state when NOT to use it — e.g. that get_portfolio should be used for current holdings — so the routing against the closest sibling is left implicit.

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.

Listed equities and ETFs. Crypto has its own feed (get_crypto_ohlcv); Japan and Europe carry no prices at all.

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'

Account limits: a free account includes the most recent 130 trading sessions of each name. Results follow the current account's history entitlement. 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 crypto (get_crypto_ohlcv). FinBridge has no real-time equity quote tool — equity prices here are end-of-day closes from the nightly ingest; the only live data is crypto (get_crypto_ticker) and regulator filings (get_dart_filings / get_edgar_filings). 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
data_as_ofNo
data_notesNo
plan_limitNo

TDQS

A5/5.0
Behavior5/5

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

The description extensively discloses behavioral nuances beyond the readOnlyHint annotation, including free-tier limits ('130 trading sessions'), the plan_limit field when trimmed, truncation semantics, and error scenarios (unknown company, JP/EU no-prices, market-specific hints). It contradicts nothing in the annotations and adds substantial transparency about account entitlement and data usage.

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 lengthy, the description is impeccably structured with clear sections (Args, Account limits, Returns, Examples, Use when, Errors) and uses line breaks for readability. Every sentence adds value—no fluff or redundancy—and the organization makes scanning for key details effortless.

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 (multiple markets, identifier formats, account limits, error conditions), the description covers all necessary context: market coverage by region, data sources, return structure, example calls, and edge-case errors. It also includes a note about live data alternatives, ensuring an agent has full situational awareness to invoke the 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 coverage is 100% with each parameter documented in the schema, but the description goes further: it explains the company resolution priority (ticker > KR code > exact name > partial match), provides concrete examples for from/to and response_format, and clarifies limit defaults. This enrichment makes parameter usage unambiguous and adds meaning 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 fetches daily OHLCV price history from the local finbridge database, specifying the resource and the verb. It also distinguishes itself from crypto-focused tools by explicitly noting 'Crypto has its own feed (get_crypto_ohlcv)' and 'Don't use for crypto' in the usage section, making the purpose unmistakable.

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 guidance: 'Use when: historical closes/volumes for charting or return calculations from ingested data' and names the alternative tool for crypto (get_crypto_ohlcv). It also clarifies limitations like 'no real-time equity quote tool' and directs to other tools for live crypto and filings, 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_tw_insider_transfersTaiwan Insider Share-Transfer Pre-AnnouncementsA
Read-only
Inspect

Taiwan insider share-transfer filings from TWSE (上市) and TPEx (上櫃), served from the local finbridge database.

⚠These are PRE-ANNOUNCEMENTS, not executed trades. Taiwan requires directors, supervisors, managers and 10% shareholders to declare a transfer BEFORE selling (內部人持股轉讓事前申報). There is no "sold" table at all — a declaration says what someone intends to transfer and by when. What does exist is the opposite: an 未轉讓 (not-transferred) table listing declarations whose window expired without a sale, with the filer's stated reason. This tool returns both.

This is why it is a separate tool from get_dart_insider_trades (Korea) and get_edgar_insider_trades (US Form 4), which report trades that already happened. Do not compare the numbers across those tools as if they were the same event.

⚠Coverage is short and has permanent holes. The upstream endpoints publish only the CURRENT day's table — there is no historical query — so our history starts when we began collecting and any day the collector missed is unrecoverable. The response's coverage.first_report_date and coverage.days say exactly how much history exists; "no rows" for an earlier date means we never had it, not that nobody filed.

⚠No rankings or aggregates in this version (no "most-sold-by-insiders this month"). A few days of snapshots is not a sample.

Units are SHARES (股) — not the thousands of shares used by Taiwan margin data. No monetary conversion is done: planned shares times a closing price is not a transaction value. Role, method and reason strings are returned in the original Chinese so they can be checked against the source.

Args:

  • company: optional filter — TW 4-digit code, '2330.TW', 'tw:2330', or the company name

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

  • role: substring of the declarant's role in Chinese (董事 / 監察人 / 經理人 / 大股東 / 法人董事代表人)

  • min_shares: minimum planned_shares (applies to the transfer table only)

  • include_untransferred: also return expired declarations that were not acted on (default true)

  • limit: 1-200 (default 50); response_format: 'markdown' | 'json'

Returns: {market, company?, range, transfers: [{report_date, company, declarant_role, declarant_name, method, period_from, period_to, planned_shares, daily_max_shares, transferee, held, planned, after}], untransferred: [{report_date, company, declarant_role, declarant_name, untransferred, held, declared, reason}], coverage: {first_report_date, last_report_date, days}, notes, data_as_of, page_url}

Use when: someone asks what Taiwanese insiders have declared they intend to sell, or whether a declared sale actually went through (an 未轉讓 row means it did not). Don't use it to claim an insider "sold" — this data cannot show that.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoLatest report date (YYYY-MM-DD)
fromNoEarliest report date (YYYY-MM-DD)
roleNoSubstring of the declarant role in Chinese (董事 / 監察人 / 經理人 / 大股東)
limitNoMax rows per table, 1-200 (default 50)
companyNoTW company filter: 4-digit code, '2330.TW', 'tw:2330', or name
min_sharesNoMinimum planned shares (股); transfer table only
response_formatNo'markdown' for tables, 'json' for compact outputmarkdown
include_untransferredNoAlso return expired declarations that were not acted on (default true)

Output Schema

ParametersJSON Schema
NameRequiredDescription
notesNo
rangeNo
marketYes
companyNo
coverageNo
page_urlNo
transfersYes
data_as_ofNo
untransferredYes

TDQS

A4.9/5.0
Behavior5/5

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

While annotations mark readOnlyHint=true and destructiveHint=false, the description goes far beyond by explaining the data is pre-announcements, not executed trades, has short unrecoverable coverage, no historical query, no aggregates, and units are shares. It also notes the 未轉讓 table. This adds critical behavioral context beyond 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 every sentence carries unique value—scope, warnings, units, usage. It is well-structured with headers and front-loads the core purpose. Slightly verbose but not redundant, earning a 4.

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 exceptionally complete: it covers return fields, coverage details, units, usage scenarios, and even explains the 未轉讓 table. Given the tool's complexity (8 params, output schema), nothing an agent needs 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?

Despite 100% schema coverage, the description adds meaning: min_shares applies to transfer table only, include_untransferred default true, role is a Chinese substring, units are shares not thousands, and no monetary conversion. It clarifies the exact meaning and constraints of parameters, exceeding the schema.

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

Purpose5/5

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

The description explicitly states it returns Taiwan insider share-transfer pre-announcements from TWSE and TPEx, clearly distinguishing them from executed trades. It names the sibling tools (get_dart_insider_trades, get_edgar_insider_trades) it is not, making its scope 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?

It provides explicit when-to-use guidance ('Use when: someone asks what Taiwanese insiders have declared they intend to sell...') and when-not-to ('Don't use it to claim an insider sold'). It also warns against comparing numbers across tools, giving clear exclusions and alternatives.

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, US, or Taiwan 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 metric-level calculation basis, dates, sources, missing reasons, and 1-2 same-market percentile hints. Computed by the nightly valuation ingest job.

Share counts: KR uses data.go.kr listed shares, US prefers SEC-reported shares, and Taiwan uses exchange-reported shares; the nightly job can fall back to net_income / eps_diluted when a positive result is available. PER prefers price / eps_diluted, falling back to market_cap / net_income. Taiwan exchange-published PER/PBR replace derived values when present. Any derived ratio whose required 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).

  • per_multiples: optional 1-5 positive user-supplied PER assumptions (maximum 1000)

  • pbr_multiples: optional 1-5 positive user-supplied PBR assumptions (maximum 100)

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

Returns the existing valuation fields plus metric_evidence and multiple_scenarios. Ratios are plain numbers; roe/debt_ratio/CAGR and scenario upside/downside are in percent. A scenario is arithmetic from the user's multiple, not a target-price recommendation. If no multiple is supplied, no multiple or target price is invented.

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: if statements are in another currency than the listing (Korean listings reporting in USD/CNY/JPY), statement values are converted at one Federal Reserve H.10 rate on or before the price date before PER/PBR/PSR (fx_conversion shows the rate and date; no rate → null). ROE/debt ratio need no conversion; growth across a statement-currency change is null. 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
pbr_multiplesNoOptional 1-5 positive PBR assumptions supplied by the user; no default is invented
per_multiplesNoOptional 1-5 positive PER assumptions supplied by the user; no default is invented
response_formatNo'markdown' for a table + interpretation, 'json' for compact machine-readable outputmarkdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
pbrNo
perNo
psrNo
roeNo
ttmNo
as_ofNo
notesNo
priceNo
sharesNo
companyYes
currencyNo
data_as_ofNo
debt_ratioNo
market_capNo
ni_cagr_3yNo
updated_atNo
fiscal_yearNo
rev_cagr_3yNo
peer_contextNo
fx_conversionNo
interpretationNo
metric_evidenceNo
peer_comparisonNo
multiple_scenariosNo

TDQS

A4.9/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnly, non-destructive, closed-world), but the description goes far beyond it: it discloses snapshot vs real-time nature, the nightly ingest job, null-return rules for bad denominators, FX conversion behavior, cross-market accounting differences, and error semantics. This is unusually rich behavioral context that the annotations cannot 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?

Content is front-loaded and clearly sectioned (prose, Args, Returns, Examples, Caveats, Use when, Errors), and each block is substantive. It is verbose, however, and the Share counts / PER fallback paragraph could be tightened for an agent-scanning tool description.

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 single-company valuation tool with an output schema, the description covers inputs, units (ratios plain, ROE/CAGR in percent), returns, multi-currency caveats, and error states. Even though an output schema exists, the documented field semantics (metric_evidence, multiple_scenarios, fx_conversion) give an agent everything needed to call and interpret 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?

Schema coverage is 100%, so baseline is 3, but the description adds real meaning beyond the schema: the company resolution priority (exact ticker > 6-digit code > exact name > partial name) and the candidate-list error on ambiguous partial matches, plus clarification that scenario outputs are arithmetic from user multiple, not invented defaults.

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+resource ('get the latest valuation snapshot for one company') and enumerates the exact metrics returned (market cap, PER, PBR, PSR, ROE, debt ratio, CAGR). It explicitly differentiates from siblings by naming screen_companies/query_db for ranking and get_dart_financials/get_edgar_financials for raw 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 'Use when / Don't use for' block gives explicit inclusion criteria (assess one company's valuation, compare to its own market) and explicit exclusions with named alternatives for both exclusion cases. Nothing is left to inference.

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

get_watchlistMy WatchlistA
Read-onlyIdempotent
Inspect

Read the companies followed by the authenticated user. Returns names, symbols and markets without changing the watchlist or holdings.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
totalNo
watchlistNo

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, covering the safety profile. The description adds that it returns specific fields (names, symbols, markets) and explicitly states it does not change the watchlist or holdings, which reinforces the non-mutating nature. This adds some value beyond annotations but isn't rich with additional behavioral details.

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

Conciseness5/5

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

The description is two short sentences that front-load the purpose and immediately state the return content and non-mutating behavior. There is no filler or redundant 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?

For a tool with no parameters and a full output schema (which describes the return structure), the description covers the purpose, the exact return fields, and the read-only nature. Nothing an agent needs to decide to call it 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?

The tool has zero parameters, so there is nothing for the description to explain. Per the calibration rule, a baseline of 4 applies when there are no parameters. The description doesn't need to add parameter 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 clearly states the verb 'Read' and the resource 'companies followed by the authenticated user', and specifies what is returned (names, symbols, markets). It distinguishes itself from write tools like manage_watchlist and from other read tools like get_portfolio or get_peers.

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 provides clear context: it is for viewing the authenticated user's watchlist. It doesn't explicitly name alternatives or say when not to use it, but the read-only framing and sibling tool manage_watchlist make the intended use obvious. It's clear enough without exclusions.

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

Store the structured holdings explicitly entered by the user in their FinBridge portfolio. Uploaded files, screenshots, chat history and extracted file content are not supported sources for this connector. 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 user specifies an asset class, 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. Use when: the user explicitly enters what they hold and wants it stored for get_portfolio. There is no per-holding edit or delete tool: to change or remove holdings, re-import the complete corrected list with replace=true (replace=false only adds/updates the rows given). Not this tool for: the watchlist (manage_watchlist — companies followed, no quantities), valuing a company (get_valuation), or reading what is already stored (get_portfolio).

IMPORTANT — read the response before telling the user you are done:

  1. Confirmation gate: if the user already has a stored portfolio, this call returns preview:true with a changes diff (added/removed/changed) and does NOT save anything, unless you pass confirm=true. Show the diff to the user — call out changes.removed especially: if the submission was only part of their holdings, those positions will look fully sold. Only pass confirm=true after the user has seen and accepted the diff (skip this if get_portfolio was empty to begin with — there is nothing to compare against).

  2. Missing fields: each saved row reports missing_fields (commonly acquired_on, since brokerage statements rarely include it) and unresolved symbols appear in needs_input — ambiguous names/codes list candidates (do not guess one), unmatched symbols need a ticker/code or a value. Rows with missing fields ARE saved (never block on incompleteness) — ask the user for the missing pieces and call this tool again for just those rows to fill them in.

  3. Cash: check the cash field. If status is not_asked, the stored portfolio has no cash balance on file (this is different from a confirmed zero) — ask the user for their cash balance (amount or % of the portfolio) and its currency, then import it as one more holding: {symbol:'현금', value, currency, asset_class:'현금'}. Without it, equity weights in get_portfolio are overstated.

  4. Always show the user the per-row summary (name/qty/avg_price recognized) before treating the import as authoritative — a misread quantity produces a wrong return. If something was saved wrong, undo it with restore_portfolio_snapshot (defaults to the snapshot right before this one).

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoSet true to apply after the user has reviewed the `changes` preview from a prior call with the same holdings/replace. Required whenever a portfolio already exists and this submission would change it; not needed for a first import into an empty portfolio.
replaceNotrue = wipe the existing portfolio (stocks + assets) and replace it; default false = merge
holdingsYesStructured holdings entered by the user. Each item accepts exactly: symbol (required), qty, avg_price, return_pct, asset_class, currency, value, acquired_on, price_symbol, unit, price_scale. Other keys (e.g. quantity, cost, price, shares) are rejected with an error naming the key — map them to qty / avg_price / value before calling.

Output Schema

ParametersJSON Schema
NameRequiredDescription
cashNo
errorNo
notesNo
changesNo
previewNo
holdingsNo
importedNo
snapshotNo
unmatchedNo
needs_inputNo

TDQS

A4.9/5.0
Behavior5/5

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

Annotations declare destructiveHint=true, openWorldHint=true, and readOnlyHint=false, but the description adds rich behavioral context beyond them: a confirmation gate that returns preview:true with a changes diff and does not save unless confirm=true, the fact that rows with missing fields are saved with missing_fields and needs_input, cash status not_asked meaning no balance is on file, and undo via restore_portfolio_snapshot. 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 purpose and usage, then organized into a numbered list under an 'IMPORTANT' heading for response handling. Despite its length, each sentence earns its place by conveying essential operational detail for a complex, destructive import tool with a confirmation gate. No redundant or filler content 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?

Given the tool's complexity, schema richness, and the presence of an output schema, the description is complete. It explains the preview/confirm workflow, how to handle missing fields and unresolved symbols, cash balance detection, and the undo path, covering everything an agent needs to invoke the tool correctly and interpret its responses.

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 meaningful usage context beyond the schema, such as how different asset types are priced, when to pass value directly for ETFs or foreign products, and additional asset_class labels. However, much of the parameter-level detail (e.g., unit, price_scale, price_symbol) is already well documented in the schema, so the added value is helpful but not exhaustive.

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 ('Store the structured holdings... in their FinBridge portfolio'), and explicitly distinguishes itself from siblings by naming what it is not for: 'Not this tool for: the watchlist (manage_watchlist), valuing a company (get_valuation), or reading what is already stored (get_portfolio).' It also clarifies supported sources and asset types. An agent can tell this apart from related tools without opening 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?

Explicit guidance is provided: 'Use when: the user explicitly enters what they hold and wants it stored for get_portfolio.' It also gives when-not conditions, lists alternatives, and covers prerequisites through the confirmation gate, missing fields, cash handling, and undo instructions. The routing logic is unambiguous.

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

manage_watchlistAdd or Remove Watchlist CompaniesA
DestructiveIdempotent
Inspect

Add or remove a company from the user's watchlist. This changes saved preferences, not financial assets. Only remove deletes an entry.

action='add' and action='remove' each take one symbol and are idempotent: adding a company already on the list leaves it there, removing one that is not on the list is a no-op. Both report the resulting list size.

Not this tool for: holdings and cash (that is a portfolio — use get_portfolio / import_portfolio), or for any market data. The watchlist stores which companies the user follows, nothing about quantities, prices or returns.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes'add' and 'remove' each need a symbol.
symbolNoStock code, ticker or company name. Required for 'add' and 'remove'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNo
errorNo
totalNo
actionNo
marketNo
symbolNo
watchedNo
watchlistNo

TDQS

A4.9/5.0
Behavior5/5

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

The description clarifies that removing deletes an entry while adding is non-destructive, and that it changes saved preferences, not financial assets. This complements the destructiveHint and idempotentHint 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 somewhat repetitive in the second paragraph, restating idempotency and the exclusion of financial assets, but it remains well-organized 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 explains what the tool does, when to use it, what it does not handle, and the result behavior (reports list size). With an output schema present, this is complete enough for an agent.

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 covers the parameters, the description adds the critical conditional requirement that symbol is needed for both 'add' and 'remove', which is not fully captured by the required array. It also clarifies action 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 clearly states the tool adds or removes a company from the user's watchlist, with specific verbs and resource. It distinguishes itself from portfolio and market data 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 explicitly says 'Not this tool for holdings and cash' and names the alternatives get_portfolio/import_portfolio, plus excludes market data. It also explains idempotent behavior for add/remove.

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 runs in a separate read-only process with SQLite authorization, a 2-second deadline, two concurrent queries per server process, and a 1 MB result budget. Free accounts cannot query raw history or history views; the latest-annual snapshot remains available.

The escape hatch for questions no dedicated tool answers — Japan, Taiwan and Europe are largely reachable only this way. Prefer screen_companies for ordinary fundamental screens (it handles per-market period and currency rules that a hand-written query will get wrong), and call get_db_schema first for the table shapes.

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. FinBridge has no real-time equity quote tool — equity prices here are end-of-day closes from the nightly ingest; the only live data is crypto (get_crypto_ticker) and regulator filings (get_dart_filings / get_edgar_filings). 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.8/5.0
Behavior5/5

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

Annotations already mark it read-only, but the description adds substantial behavioral detail: rejected non-SELECT inputs, forbidden keywords, separate read-only process, 2-second deadline, concurrent query limit, 1 MB result budget, and free-account restrictions. 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?

Well-organized with sections for description, args, returns, examples, use-when, and errors. Some redundancy exists between the main description and the sql parameter description, but the content is dense and purposeful.

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 input constraints, output shape (columns, rows, row_count, truncated), example queries, error behavior, and data limitations. This is a complex SQL tool and the description gives an agent everything needed to use 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 descriptions already fully cover all three parameters. The tool description adds meaningful examples, clarifies trailing semicolon tolerance, explains compact JSON output, and notes helpful views and data coverage, going beyond 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?

States exactly what it does: runs a single read-only SELECT query against the FinBridge database. Clearly differentiates from sibling tools like screen_companies and get_db_schema by name and scope.

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' guidance (custom aggregation/joins that screen_companies cannot express) and explicit 'Don't use' guidance (anything that writes; no real-time equity data). Names relevant alternative tools such as get_crypto_ticker, get_dart_filings, and get_edgar_filings.

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

restore_portfolio_snapshotRestore a Past PortfolioA
Destructive
Inspect

Roll the stored portfolio back to a past snapshot from get_portfolio_history, replacing ALL current holdings and assets with that snapshot's content. Use this to undo a bad import_portfolio call. Omit snapshot_id to restore the snapshot immediately before the current state (undo the last change). This action is itself recorded as a new snapshot — history is append-only, so restoring is itself reversible the same way. Tell the user what was restored (get_portfolio afterwards shows it valued at current prices).

ParametersJSON Schema
NameRequiredDescriptionDefault
snapshot_idNoSnapshot id from get_portfolio_history. Omit to restore the one immediately before the latest.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
notesNo
assetsNo
holdingsNo
snapshotNo
restored_fromNo

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true and idempotentHint=false; the description goes further by disclosing that ALL holdings are replaced, that the restore is itself recorded as a new snapshot, and that history is append-only so the action is reversible the same way. It also flags a user-facing consequence (tell the user what was restored).

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?

Front-loads the destructive scope in the first sentence, then usage, then reversibility. Four sentences with little waste, though the closing parenthetical about get_portfolio valuation is marginally decorative.

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 destructive, non-idempotent mutation with an output schema present, the description covers scope of destruction, the optional-parameter fallback, and the reversibility model. It tells the agent everything needed to call it responsibly without explaining return values.

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 schema already documents the omit behavior, but the description adds interpretive meaning by framing omission as 'undo the last change' and restating the fallback semantics in plain language. This is a modest value-add over the baseline 3.

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 (roll back/restore) and resource (stored portfolio snapshot), names the source (get_portfolio_history), and specifies scope ('replacing ALL current holdings and assets'). It is clearly distinguishable from siblings like import_portfolio and get_portfolio_history.

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?

Gives explicit when-to-use ('to undo a bad import_portfolio call') and a precise operating rule for the optional parameter (omit snapshot_id to undo the last change). The alternative tools are named and tied to the condition that selects them.

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.

Not this tool for: US registrants (use search_edgar_company). Japan, Taiwan and Europe have no search tool — reach them through screen_companies or query_db on the companies table.

Args:

  • query: company name in Korean ('삼성전자') or English ('Samsung Electronics'), 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, corp_name_en, stock_code}]} — corp_name is the Korean name DART registers, corp_name_en the registered English name where the company files one (about three quarters of Korean issuers). stock_code is null for unlisted companies. Match priority: exact stock code > exact Korean name > listed Korean partial > unlisted Korean partial > English name. English matching reads our own company table, so it covers issuers whose English name we hold, not every DART entity.

Examples:

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

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

  • {query: 'Samsung Electronics'} -> 삼성전자 (matched on the registered English name)

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

A5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds rich behavioral detail beyond that: match priority order, English matching limitation (reads own company table), error conditions (DART_API_KEY not configured, no match returns count 0), and the fact that corp_code is required by other dart_* tools. This fully discloses operational 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 well-structured with headers (Args, Returns, Match priority, Examples, Use when, Errors). Every sentence adds value: alternatives, parameter details, return format, matching nuances, and errors. It is long but not padded; each section is necessary for correct invocation.

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 output schema exists and describes return fields, so the description needn't repeat them. It covers match priority, English matching caveat, error handling, and the relationship to other dart_* tools. An agent has all information needed to decide when to call and interpret results 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%, but the description adds significant meaning: query accepts three formats (Korean/English name, 6-digit stock code, 8-digit corp_code) with examples; listed_only clarifies the default true and explains the ~90k unlisted entities; limit range is reaffirmed. Examples illustrate realistic usage. This goes far beyond 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 states the exact verb (search) and resource (companies registered with DART), and clarifies the output (corp_code). It explicitly names the sibling search_edgar_company as the alternative for US registrants, making differentiation 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?

Explicitly states when to use ('when you need a corp_code or must disambiguate similar names') and when not to ('Don't use for US companies'), with explicit alternatives (search_edgar_company, screen_companies, query_db) for other regions. No inference needed.

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.

Not this tool for: Korean companies (use search_dart_company). Japan, Taiwan and Europe have no search tool — reach them through screen_companies or query_db on the companies table.

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.6/5.0
Behavior4/5

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

The annotations already indicate readOnlyHint and destructiveHint false, and the description adds useful behavioral context by describing the return structure, the error behavior for no matches, and the limitation that only SEC registrants with a listed ticker are searchable. It does not contradict the annotations and adds meaningful transparency about 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 well-organized with clear sections for use cases, examples, and errors. It is slightly repetitive in places (e.g., the return shape is described both in prose and in the Returns line), but every section contributes useful information and the overall length is appropriate for a tool with routing 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 provides complete context for selecting and calling the tool: when to use it, when to skip it, what it returns, error behavior, search limitations, and examples. Given the sibling tools include related search and EDGAR functions, this context is sufficient for an agent to use the tool correctly without further clarification.

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 provides full descriptions for both parameters, so the baseline is 3. The description adds value by giving concrete examples of accepted query forms (tickers, name fragments, CIKs), explaining the ranking order, and repeating/illustrating the limit behavior, which goes beyond the schema text.

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 as a search over SEC EDGAR registrants by ticker, company name, or CIK, and specifically notes that it returns the 10-digit zero-padded CIK needed by other edgar_* tools. It also distinguishes itself from search_dart_company 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 explicitly states when to use the tool ('use when you need a CIK or to disambiguate a company name'), when it can be skipped (exact tickers can go directly to other edgar_* tools), and when not to use it (Korean companies, private companies). It also names the alternative tool for Korean companies, giving clear routing guidance.

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

Tool Schema Changelog

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

  1. 20 tool updates
    • Removedanalyze_factors
    • Removedbacktest_portfolio
    • Removedcompare_crypto_exchanges
    • Removeddelete_backtest_run
    • Removedget_backtest_runs
    • Removedget_crypto_ohlcv
    • Removedget_crypto_ticker
    • Removedget_technicals
    • Removedreal_estate_get_coverage
    • Removedreal_estate_list_regions
    • Removedreal_estate_search_trades
    • Removedreal_estate_summarize_trades
    • Removedscreen_canslim
    • Removedscreen_companies
    • Removedscreen_etfs
    • Removedscreen_kell
    • Removedscreen_minervini
    • Removedscreen_schwartz
    • Removedscreen_technical
    • Changedsearch_dart_company1 field changed
      • addedOutput schema / properties / companies / items / properties / corp_name_en
        Added value: +{
        +  "$ref": "#/properties/companies/items/properties/corp_code"
        +}
  2. 1 tool update
    • Changedget_valuation1 field changed
      • addedOutput schema / properties / fx_conversion
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "properties": {},
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
  3. 1 tool update
    • Changedget_dart_financials1 field changed
      • addedOutput schema / properties / earnings_disclosures
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {},
        +  "type": "object"
        +}
  4. 1 tool update
    • Changedget_dart_financials3 fields changed
      • addedInput schema / properties / as_of
        Added value: +{
        +  "description": "Optional YYYY-MM-DD. Return point_in_time: the preserved version of this period that was public on that day.",
        +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +  "type": "string"
        +}
      • addedOutput schema / properties / point_in_time
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {},
        +  "type": "object"
        +}
      • addedOutput schema / properties / revision_links
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {},
        +  "type": "object"
        +}
  5. 3 tool updates
    • Addedget_portfolio_history
    • Changedimport_portfolio9 fields changed
      • addedInput schema / properties / confirm
        Added value: +{
        +  "description": "Set true to apply after the user has reviewed the `changes` preview from a prior call with the same holdings/replace. Required whenever a portfolio already exists and this submission would change it; not needed for a first import into an empty portfolio.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / holdings / description
        Previous value: -"Structured holdings entered by the user. Each item accepts exactly: symbol (required), qty, avg_price, return_pct, asset_class, currency, value, price_symbol, unit, price_scale. Other keys (e.g. quantity, cost, price, shares) are rejected with an error naming the key — map them to qty / avg_price / value before calling."New value: +"Structured holdings entered by the user. Each item accepts exactly: symbol (required), qty, avg_price, return_pct, asset_class, currency, value, acquired_on, price_symbol, unit, price_scale. Other keys (e.g. quantity, cost, price, shares) are rejected with an error naming the key — map them to qty / avg_price / value before calling."
      • addedInput schema / properties / holdings / items / properties / acquired_on
        Added value: +{
        +  "description": "Purchase date (YYYY-MM-DD), if the user gave one. Brokerage statements usually omit this — it is fine to leave it out and ask later.",
        +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +  "type": "string"
        +}
      • changedInput schema / properties / holdings / items / properties / currency / description
        Previous value: -"Display currency. Defaults to USD for crypto and US tickers, KRW otherwise."New value: +"Display currency. Defaults to USD for crypto and US tickers, KRW otherwise. Always ask when cash is mixed KRW/USD."
      • addedOutput schema / properties / cash
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {},
        +  "type": "object"
        +}
      • addedOutput schema / properties / changes
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {},
        +  "type": "object"
        +}
      • addedOutput schema / properties / needs_input
        Added value: +{
        +  "items": {
        +    "additionalProperties": true,
        +    "properties": {},
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / preview
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / snapshot
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {},
        +  "type": "object"
        +}
    • Addedrestore_portfolio_snapshot
  6. 3 tool updates
    • Removedget_fred_series
    • Removedget_fred_snapshot
    • Removedsearch_fred_series
  7. 4 tool updates
    • Addedreal_estate_get_coverage
    • Addedreal_estate_list_regions
    • Addedreal_estate_search_trades
    • Addedreal_estate_summarize_trades
  8. 1 tool update
    • Changedget_peers1 field changed
      • changedInput schema / properties / rank / description
        Previous value: -"'size' (default) or 'segments' = business-mix similarity"New value: +"Omit for business-related references; 'size' explicitly requests same-currency size references; 'segments' uses business-mix similarity"
  9. 1 tool update
    • Changedget_edgar_13f15 fields changed
      • addedOutput schema / properties / calculation_version
        Added value: +{
        +  "$ref": "#/properties/filer/properties/name"
        +}
      • addedOutput schema / properties / comparison_exclusions
        Added value: +{
        +  "items": {
        +    "additionalProperties": true,
        +    "properties": {},
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / comparison_status
        Added value: +{
        +  "$ref": "#/properties/filer/properties/name"
        +}
      • addedOutput schema / properties / generated_at
        Added value: +{
        +  "$ref": "#/properties/filer/properties/name"
        +}
      • addedOutput schema / properties / holdings / items / properties / pct_of_portfolio
        Added value: +{
        +  "$ref": "#/properties/total_value"
        +}
      • addedOutput schema / properties / holdings / items / properties / put_call
        Added value: +{
        +  "$ref": "#/properties/filer/properties/name"
        +}
      • addedOutput schema / properties / holdings / items / properties / quantity_type
        Added value: +{
        +  "$ref": "#/properties/filer/properties/name"
        +}
      • addedOutput schema / properties / holdings / items / properties / shares
        Added value: +{
        +  "$ref": "#/properties/total_value"
        +}
      • addedOutput schema / properties / holdings / items / properties / value
        Added value: +{
        +  "$ref": "#/properties/total_value"
        +}
      • addedOutput schema / properties / index_warnings
        Added value: +{
        +  "items": {
        +    "additionalProperties": true,
        +    "properties": {},
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / prior_reconstruction_status
        Added value: +{
        +  "$ref": "#/properties/filer/properties/name"
        +}
      • addedOutput schema / properties / prior_sources
        Added value: +{
        +  "items": {
        +    "additionalProperties": true,
        +    "properties": {},
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / reconstruction_status
        Added value: +{
        +  "$ref": "#/properties/filer/properties/name"
        +}
      • addedOutput schema / properties / sources
        Added value: +{
        +  "items": {
        +    "additionalProperties": true,
        +    "properties": {},
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "filer",
        -  "holdings",
        -  "changes"
        -]New value: +[
        +  "filer",
        +  "holdings",
        +  "index_warnings",
        +  "comparison_exclusions",
        +  "sources"
        +]
  10. 1 tool update
    • Changedget_dart_document6 fields changed
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "overview",
        -  "section",
        -  "table"
        -]New value: +[
        +  "overview",
        +  "section",
        +  "table",
        +  "compare_tables",
        +  "compare_sections"
        +]
      • addedInput schema / properties / compare_index
        Added value: +{
        +  "exclusiveMinimum": 0,
        +  "maximum": 10000,
        +  "type": "integer"
        +}
      • addedInput schema / properties / compare_rcept_no
        Added value: +{
        +  "pattern": "^\\d{14}$",
        +  "type": "string"
        +}
      • changedOutput schema / properties / action / enum
        Previous value: -[
        -  "overview",
        -  "section",
        -  "table"
        -]New value: +[
        +  "overview",
        +  "section",
        +  "table",
        +  "compare_tables",
        +  "compare_sections"
        +]
      • addedOutput schema / properties / comparison
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {},
        +  "type": "object"
        +}
      • addedOutput schema / properties / preservation
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {},
        +  "type": "object"
        +}
  11. 1 tool update
    • Changedget_dart_financials1 field changed
      • addedOutput schema / properties / preserved_revisions
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {},
        +  "type": "object"
        +}
  12. 3 tool updates
    • Addedget_dart_document
    • Changedget_dart_financials6 fields changed
      • addedInput schema / properties / account_limit
        Added value: +{
        +  "default": 40,
        +  "description": "Maximum returned account rows (default 40).",
        +  "maximum": 200,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / account_query
        Added value: +{
        +  "description": "Optional account name/account_id substring.",
        +  "maxLength": 100,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / statement
        Added value: +{
        +  "description": "Optional statement-group filter.",
        +  "enum": [
        +    "BS",
        +    "IS",
        +    "CIS",
        +    "CF",
        +    "SCE"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / account_selection
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {},
        +  "type": "object"
        +}
      • addedOutput schema / properties / statement_groups
        Added value: +{
        +  "items": {
        +    "additionalProperties": true,
        +    "properties": {},
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / sum_checks
        Added value: +{
        +  "items": {
        +    "additionalProperties": true,
        +    "properties": {},
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
    • Changedget_valuation4 fields changed
      • addedInput schema / properties / pbr_multiples
        Added value: +{
        +  "description": "Optional 1-5 positive PBR assumptions supplied by the user; no default is invented",
        +  "items": {
        +    "exclusiveMinimum": 0,
        +    "maximum": 100,
        +    "type": "number"
        +  },
        +  "maxItems": 5,
        +  "minItems": 1,
        +  "type": "array"
        +}
      • addedInput schema / properties / per_multiples
        Added value: +{
        +  "description": "Optional 1-5 positive PER assumptions supplied by the user; no default is invented",
        +  "items": {
        +    "exclusiveMinimum": 0,
        +    "maximum": 1000,
        +    "type": "number"
        +  },
        +  "maxItems": 5,
        +  "minItems": 1,
        +  "type": "array"
        +}
      • addedOutput schema / properties / metric_evidence
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "properties": {},
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / multiple_scenarios
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "properties": {},
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
  13. 1 tool update
    • Changedget_edgar_financials1 field changed
      • addedOutput schema / properties / notes
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Provides Korean stock market data, including DART electronic disclosures and KRX trading information, enabling users to query company profiles, financial statements, and stock trade details via MCP clients.
    9
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP Server for public disclosure information of Korean companies, powered by the dartpoint.ai API.
    3
    Apache 2.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    Korean stocks (KOSPI/KOSDAQ/KONEX), no signup, no API key. 12 read-only tools, streamable-http. Post-filing price paths BY DART FILING TYPE (market-adjusted median h0/h1/h5, 95% CI) + per-event ledger with receipt times (HH:MM) that public APIs omit. Plus T+1 closes, preliminary earnings, daily close history. Registry: com.aikstockdata/mcp. Updated each trading day ~18:30 KST, not real-time.
    7
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.