Tool status
All 27 Financial Datasets MCP tool names are implemented against live Monid routes and contract tested. The advertised names and input schemas are diffed against the captured Financial Datasets surface by test, so the two cannot silently drift. Tool descriptions are this server’s own prose. Call any of them over MCP at/mcp or /api.
REST coverage
All 54 Financial Datasets REST paths are registered, and every one of them answers from a live source. There are no stubs.- As-reported, 4 routes
/financials/as-reported, /financials/income-statements/as-reported, /financials/balance-sheets/as-reported and /financials/cash-flow-statements/as-reported read the rendered statement files EDGAR generates from a filing’s own XBRL presentation linkbase, so the line_items tree is the filing’s hierarchy.They match Financial Datasets’ structure, not its labels. Apple’s filing prints “Gross margin” where Financial Datasets prints “Gross Profit”, and this server prints what the filing prints. full_label comes from the row’s XBRL element name, so it agrees with theirs either way.Deviations that will change a client’s behavior
These routes work, but not the way Financial Datasets does. Read them before pointing an existing integration here.Cash flow statement source
Measured 2026-09-04 against SEC XBRL across eight large caps (AAPL, MSFT, XOM, KO, TSLA, PFE, VZ, NVDA), the normalized statements feed’s cash flow subtotals came back: operating 8/8 correct, investing 0/8, financing 4/8, net change in cash 0/8. Apple FY2025 investing read 27,910,000,000 against the 10-K’s 15,195,000,000; Microsoft FY2026 read -23,552,000,000 against SEC’s -139,500,000,000. The cash flow statement is therefore sourced from marketbeat, which matched SEC line for line on every figure checked. That applies on every path that builds one:get_cash_flow_statement, get_all_financials, and search_line_items when a cash flow field is requested. Income statement and balance sheet stay on the normalized feed, which agrees with SEC where measured.
Two consequences a caller will notice. marketbeat does not report share_based_compensation or ending_cash_balance, so those two fields are omitted on annual, quarterly and ttm cash flow records rather than carried over from a feed proven wrong on three of four subtotals. And the correction costs one extra provider call per statement, $0.02 measured, which is why search_line_items only pays it when the requested line items include a cash flow field.
The defect was reported to the upstream provider on 2026-09-04.
REST and MCP disagree on defaults
The same tool can return different data depending on which transport called it, if you rely on a default instead of passing the parameter.get_income_statement, get_balance_sheet, get_cash_flow_statement, and get_financial_metrics default period to ttm in the MCP tool schema, matching the published Financial Datasets schema. The REST route for the same data defaults an omitted period to annual, because the REST handler always fills a value before calling the tool. Pass period explicitly on both transports.
get_filings defaults limit to 100 over MCP and to 10 over REST, for the same reason.
Response contract
A success response contains only Financial Datasets schema keys, in schema property order. A field the server cannot source is left out, never set to null or guessed. Every failure uses the Financial Datasets{"error": <code>, "message": <text>} shape, covered in Errors. Pagination follows Pagination. Cost and provenance never appear in a response body. They go to a receipts ledger, one row per Monid call, recording the provider, endpoint, run id and measured cost.
Known gaps, endpoint by endpoint
Company lookup is ticker only
Company lookup is ticker only
cik is accepted for parity but answers bad_request. get_company_facts sources ticker and name only.TTM statements are computed, not sourced
TTM statements are computed, not sourced
Trailing-twelve-month rows are built locally from four consecutive quarters. Flow fields are summed, weighted-average shares averaged, and balance-sheet fields carry over from the final quarter. TTM rows omit
fiscal_period and currency, and omit filing identity, since a TTM window spans more than one filing.Prices: ascending order, local aggregation, single interval multiplier
Prices: ascending order, local aggregation, single interval multiplier
get_stock_prices returns ascending time order. Week, month and year bars are aggregated locally from daily bars. time is the bar’s end date in UTC. interval_multiplier must be 1.Filing exhibits are not sourced
Filing exhibits are not sourced
get_filing_items accepts include_exhibits for parity, but true answers bad_request.Filing items are extracted synchronously
Filing items are extracted synchronously
/filings/items runs the extraction inline and returns items on the same response. It never issues a request id, so /filings/items/requests/{request_id} answers not_found for any id rather than reporting a request as pending that will never complete.Earnings composition is narrower
Earnings composition is narrower
get_earnings with a ticker composes records from 10-K and 10-Q filing events only; 8-K earnings releases are not composed. Without a ticker it answers the Nasdaq earnings calendar feed, five records. Records omit any block whose period is absent from the underlying statements matrix.Financial metrics omit market-derived valuation fields
Financial metrics omit market-derived valuation fields
get_financial_metrics leaves out fields needing a historical market price we do not have: enterprise_value, price_to_* ratios, EV multiples, free_cash_flow_yield, peg_ratio, return_on_invested_capital, currency, filing_datetime.Insider trades are capped at 15 rows
Insider trades are capped at 15 rows
Financial Datasets allows up to 5000. This server caps at 15, the size of the validated SEC Form 4 feed it reads.
form_type filtering is rejected, because the underlying route reports no form types. name is the raw insider relationship text, which carries the person’s job title where Financial Datasets returns the name alone. title, transaction_code, security_title and shares_owned_before_transaction are omitted.Ownership state data runs months behind
Ownership state data runs months behind
Measured 2026-09-04: the newest record in the 13D feed behind
/beneficial-ownership and /activist-ownership was filed 2026-03-06, roughly six months back. This is not a real-time feed. Every row carries its own filing_date and event_date so recency is readable directly. Insider ownership is a different case and tracked filings within days.Beneficial ownership reports fewer fields
Beneficial ownership reports fewer fields
Financial Datasets returns 26 fields per stake; this server sources 11. The voting and dispositive power columns,
issuer_cik, issuer_cusip, accession_number and the amendment fields are absent from the 13D/13G feed this reads, so they are omitted. share_change and share_change_percent are extra, and genuinely sourced.Insider ownership reports fewer fields
Insider ownership reports fewer fields
Financial Datasets returns 21 fields; this server sources 9.
title, is_officer, is_board_director, is_ten_percent_owner and the derivative-security block need a Form 3/4/5 XML parse this route does not do. form_type filtering is rejected: the feed carries no Form 3/5 classification.Screener supports two fields
Screener supports two fields
screen_stocks executes exchange and market_cap with the eq operator through the Nasdaq screener. Any other field or operator answers bad_request before any Monid call. list_stock_screener_filters lists only those two, not the full Financial Datasets catalog of 113 filterable fields.Should you migrate an existing integration
If your integration reads normalized statements, metrics, prices, filings, news, earnings, ownership or KPI data, and does not depend on the omitted fields above, pointing your base URL and key here is close to a drop-in swap. Do not migrate yet if you depend oncik-keyed company lookup, market-wide news, or an unscoped IPO or investor listing. The as_reported=true flag on the normalized statement tools is also still rejected; ask the dedicated as-reported routes above for that hierarchy instead. File an issue on GitHub if you need one of those.