{"name":"io.github.aatharva16/dalalos","slug":"aatharva16-dalalos","title":"DalalOS","description":"Indian NSE/BSE research data and mechanically-computed ratios; read-only market tools.","url":"https://mcp.market/server/aatharva16-dalalos","rating":null,"grade":"C","score":55,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":5,"stars":null,"forks":null,"downloads_week":null,"last_push_at":null,"license":null},"uptime":{"percent":100,"checks":28,"ok":28,"last_checked_at":"2026-09-27T09:55:47.462Z","last_ok_at":"2026-09-27T09:55:47.462Z","latency_ms":970},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/BeyondNoww/indianstock-data-mcp","website":null,"version":"0.1.0","remotes":[{"type":"streamable-http","url":"https://mcp.dalalos.in/mcp"}],"packages":[],"tools":[{"name":"add_to_watchlist","description":"Add one or more stocks to the caller's DalalOS watchlist, accepting a pasted list.\n\n    Use this when the user says \"watch X\", \"track X\", \"add X to my watchlist\", or asks to save\n    stocks they just searched/screened/analyzed via DalalOS for later. This writes to DalalOS's\n    OWN watchlist (tied to the caller's DalalOS account) -- if another connected MCP server also\n    exposes an add-to-watchlist tool, it is a DIFFERENT, non-overlapping list; use this one for\n    anything the user wants tracked specifically through DalalOS.\n\n    `symbols` accepts a list of strings or a single string, and any entry may itself be a\n    DELIMITED PASTE -- commas, newlines, semicolons, tabs or pipes -- so a screener export can be\n    handed over as-is. Each fragment is resolved by exact identifier (NSE symbol, ISIN, BSE code)\n    first, then by company name, so \"Gandhar Oil\" becomes GANDHAR. Capped at\n    `watchlist_tool.MAX_WATCHLIST_BATCH` (200) resolved symbols per call.\n\n    Fragments are never guessed at. The response splits three ways: `watchlist` (added),\n    `unmatched` (no match), and `ambiguous` (two or more plausible matches, returned WITH their\n    candidates so you can ask the user which they meant rather than picking one). Space-separated\n    company names cannot be split reliably -- \"GANDHAR OIL SAVITA OIL\" is one fragment, not two --\n    so ask the user for one per line or comma-separated if a paste comes back unmatched.\n\n    Re-adding a symbol already on the watchlist is a no-op, not an error. Requires an\n    authenticated caller; see `get_watchlist` for the auth error shape.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"symbols":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}],"title":"Symbols"}},"required":["symbols"],"title":"add_to_watchlistArguments"}},{"name":"get_announcement_bucket","description":"Get every company that filed a matching BSE announcement in a trailing window, market-wide.\n\n    `bucket` is one of the ids from list_announcement_buckets (e.g. \"order-receipts\",\n    \"fundraise\"). `days` (1..90, default 7) bounds the trailing window over filing date. Returns\n    newest first across the WHOLE universe (not one security). Metadata only — the raw disclosed\n    subject/headline plus a link to the source BSE filing; no PDF parsing, no verdicts. Capped\n    at 200 rows; `truncated: true` means more announcements matched the window than were\n    returned (narrow `days` to see the rest) — `total_scanned` reports the true match count,\n    uncapped. Each event carries its `news_id` — pass it to get_filing_extract for that filing's\n    extracted facts.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"bucket":{"title":"Bucket","type":"string"},"days":{"default":7,"title":"Days","type":"integer"}},"required":["bucket"],"title":"get_announcement_bucketArguments"}},{"name":"get_batch_quotes","description":"Get EOD quotes for up to 20 Indian stocks in one call (peer benchmarking).\n\n    Each item carries the same fields as get_stock_quote (currency, vwap, bse_reported, any\n    valuation_notes/ratios_caveat/dividend fields) plus `status` and `error` keys, so an\n    unresolved or uncached symbol is reported per-item rather than failing the whole batch.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"symbols":{"items":{"type":"string"},"title":"Symbols","type":"array"}},"required":["symbols"],"title":"get_batch_quotesArguments"}},{"name":"get_brsr","description":"Get BRSR (Business Responsibility & Sustainability Report) ESG disclosures for a stock.\n\n    Accepts NSE symbol, ISIN, or BSE code. `years` (1..10, default 3) caps fiscal years returned,\n    newest first. Each year gives curated KPIs grouped as `emissions` (Scope 1/2 + intensity),\n    `energy`, `water`, `waste`, `social` (female board/KMP %, LTIFR, fatalities, POSH complaints,\n    CSR spend, ...), `governance`, and `meta` — each `{value, unit}`, raw as filed with SEBI.\n    `include_raw=True` also returns the full ~800-concept BRSR map exactly as disclosed.\n\n    SEBI's mandatory ESG filing for the top 1000 listed companies (LODR Reg 34(2)(f)). Raw\n    disclosed figures only — never an ESG score, rating, or verdict (SEBI-RA line). Coverage\n    starts from whenever the nightly refresh began ingesting the company's BRSR.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"title":"Query","type":"string"},"years":{"default":3,"title":"Years","type":"integer"},"include_raw":{"default":false,"title":"Include Raw","type":"boolean"}},"required":["query"],"title":"get_brsrArguments"}},{"name":"get_bulk_block_deals","description":"Get NSE bulk/block trade disclosures for an Indian stock.\n\n    Accepts NSE symbol, ISIN, or BSE code. `deal_type` optionally narrows to \"bulk\" or \"block\"\n    (omitted returns both); `days` (1..1825, default 90) bounds the trailing window; `limit`\n    (1..500, default 100) caps rows returned, newest first.\n\n    Each row is a raw disclosed (symbol, counter-party, direction) record: `client_name`,\n    `buy_sell` (\"BUY\"/\"SELL\"), `quantity`, `price`, and `remarks` (bulk only). NSE's feed reports\n    one row per counter-party + direction, not a matched buyer/seller pair — there is no official\n    \"buyer paired with seller\" record. Only NSE's most-recently-published trading day is fetched\n    upstream (no reachable historical bulk/block archive), so coverage starts from whenever the\n    nightly refresh job began running, not further back.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"title":"Query","type":"string"},"deal_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Deal Type"},"days":{"default":90,"title":"Days","type":"integer"},"limit":{"default":100,"title":"Limit","type":"integer"}},"required":["query"],"title":"get_bulk_block_dealsArguments"}},{"name":"get_company_exposures","description":"Return one company's REVIEWED macro-factor exposures, labelled via the factor catalog.\n\n    Cache-only, read-only: the company's reviewed ``company_exposures`` rows joined to the\n    ``factor_registry`` catalog, so each exposure carries its factor label/description/dimension\n    alongside the disclosed pathway (directness/direction/lag/mechanism) and source evidence.\n\n    This is a DIFFERENT tool from ``get_company_macro_exposures`` (two similarly-named tools): this\n    one is the plain, raw per-company evidence listing — no ``as_of_date``/factor filter, no live\n    PPAC/FBIL macro window, no eligibility signals. ``get_company_macro_exposures`` is the\n    signal-eligibility tool that evaluates those exposures against a complete official macro\n    window. Neither ever claims a macro move caused or will cause an earnings/price/investment\n    outcome (SEBI-RA line). A company with no reviewed exposures returns an empty success envelope.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"title":"Query","type":"string"}},"required":["query"],"title":"get_company_exposuresArguments"}},{"name":"get_company_macro_exposures","description":"Return cached company macro pathway evidence and eligible official context signals.\n\n    Signals are emitted only when an active, reviewed, sourced company exposure passes the\n    factor policy against a complete official PPAC Indian Basket or FBIL USD/INR window. This is\n    conditional context only: it never states that a macro move caused or will cause an earnings,\n    price, or investment outcome. Missing evidence is returned as explicit coverage, not inferred.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"title":"Query","type":"string"},"factors":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Factors"},"as_of_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"As Of Date"}},"required":["query"],"title":"get_company_macro_exposuresArguments"}},{"name":"get_company_operating_metrics","description":"Return cached, source-grounded operating KPI history for one company.\n\n    Coverage distinguishes company-disclosed values from ``not_disclosed`` fields. It never\n    infers a current order book from a new order and never fetches or writes on this read path.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"title":"Query","type":"string"},"metrics":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Metrics"},"from_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"From Date"},"to_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"To Date"},"latest_only":{"default":false,"title":"Latest Only","type":"boolean"},"limit":{"default":100,"title":"Limit","type":"integer"}},"required":["query"],"title":"get_company_operating_metricsArguments"}},{"name":"get_company_profile","description":"Get a company profile: identity, sector/industry, market snapshot, and TTM summary.\n\n    Assembled from cached security master + quotes + financials. Accepts NSE symbol, ISIN, or\n    BSE code. `fundamentals` is None when no financials are cached yet; `market` is None when\n    no quote is cached. When present, `market` carries `currency` (\"INR\") and, only when a\n    split/bonus fell inside the trailing 52 weeks, `week52_adjustments` — the same treatment\n    get_stock_quote gives its own snapshot. Both `market` and `fundamentals` may carry caveat\n    fields (e.g. `market.valuation_notes`, `fundamentals.ttm.basis_note`,\n    `fundamentals.latest_period_income.non_recurring_items_note`) when a figure is suppressed\n    or driven by a one-off/non-recurring item — always surface these alongside the figure they\n    annotate rather than the bare number.\n\n    `market.bse_reported`, when present, carries BSE's OWN published ROE/operating margin/net\n    margin — a DIFFERENT, BSE-computed figure (not necessarily the same period or\n    consolidated/standalone basis) from `fundamentals`' XBRL-derived ratios. Cross-check/\n    fallback signal only — never the same number as the computed `roe`/margins.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"title":"Query","type":"string"}},"required":["query"],"title":"get_company_profileArguments"}},{"name":"get_company_report","description":"Get a source-linked, read-only canonical company report for one security.\n\n    Accepts an NSE symbol, ISIN, BSE code, or company name. `days` (1-365, default 90) is the\n    reporting window that selects which recent disclosures are in scope. Returns the validated\n    `company_report_v1` model as the envelope `data`: company identity, source-linked `facts`\n    with `citations`, mechanically-computed `calculations`, evidence-referenced `claims`,\n    materiality-bucketed `events`, and a `coverage` block that names any missing reviewed mapping\n    rather than implying non-disclosure.\n\n    This is DalalOS's own consolidated report over its cached exchange filings + reviewed\n    exposure/peer mappings; if another connected MCP server exposes a similarly-named\n    \"company report\" tool it is a DIFFERENT, non-interchangeable source. Read-only: assembled\n    entirely from cache, no upstream fetch and no LLM call. Every number in a claim references\n    the fact/calculation supporting it, and NO verdict, target price, or buy/sell language can\n    appear — the canonical validator rejects such a report before it is ever built (SEBI\n    research-analyst boundary). An unresolvable query (or a required input with nothing cached)\n    returns `reason_code=\"not_found\"`; an out-of-range `days` returns `invalid_argument`.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"title":"Query","type":"string"},"days":{"default":90,"title":"Days","type":"integer"}},"required":["query"],"title":"get_company_reportArguments"}},{"name":"get_corporate_actions","description":"Get the disclosed corporate-action timeline for ONE STOCK, HISTORICAL (splits, bonuses,\n    dividends, etc.) — the per-stock, backward-looking sibling of get_market_calendar (whole-\n    market, any window, all event types merged) and get_upcoming_results (whole-market, forward-\n    only results convenience). Use this tool, not get_market_calendar, when you want one\n    company's corporate-action history rather than a market-wide view.\n\n    Accepts NSE symbol, ISIN, or BSE code. `years` (1..20, default 5) bounds the window.\n    `types` optionally filters to a subset of action types. Newest first; raw disclosures.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"title":"Query","type":"string"},"years":{"default":5,"title":"Years","type":"integer"},"types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Types"}},"required":["query"],"title":"get_corporate_actionsArguments"}},{"name":"get_data_freshness","description":"Report cache freshness: last successful refresh per data domain and overall health.\n\n    Every scraper-backed domain (including fii_dii and the ipos family) carries a staleness\n    threshold matched to its real refresh cadence, so a domain whose scraper job silently stops\n    running gets flagged stale rather than reporting `max_age_hours: null` forever.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"title":"get_data_freshnessArguments"}},{"name":"get_delivery_trends","description":"Get the delivery-volume / delivery-percentage trend for an Indian stock.\n\n    Accepts NSE symbol, ISIN, or BSE code. `days` (1..1825) bounds the lookback window.\n    Returns the raw delivery quantity and delivery % time series from the NSE bhavcopy.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"title":"Query","type":"string"},"days":{"default":90,"title":"Days","type":"integer"}},"required":["query"],"title":"get_delivery_trendsArguments"}},{"name":"get_derivatives_positioning","description":"Get NSE F&O (futures & options) positioning for one underlying.\n\n    Accepts an NSE symbol, ISIN, or BSE code for a stock, OR a raw F&O underlying/index name\n    (e.g. \"NIFTY\", \"BANKNIFTY\") that has no security-master row of its own.\n\n    Returns the latest trading day's aggregate: `futures_oi`/`futures_oi_change`, `call_oi`/\n    `put_oi`, `pcr` (put_oi / call_oi — a mechanically-computed ratio, not a signal),\n    `total_volume`, and `in_ban_list`. Raw NSE bhavcopy figures only — no OI-buildup\n    interpretation or bullish/bearish framing (SEBI-RA line).\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"title":"Query","type":"string"}},"required":["query"],"title":"get_derivatives_positioningArguments"}},{"name":"get_dividends","description":"Get the cash-dividend history for an Indian stock.\n\n    Accepts NSE symbol, ISIN, or BSE code. `years` (1..15, default 5) bounds the window.\n    Returns disclosed dividend amounts per share with ex-dates. Raw disclosures only.\n\n    `annual_totals` (fiscal-year, Apr-Mar buckets) also carries a dividend-YIELD HISTORY: each\n    bucket's `fy_end_price_date`/`fy_end_price` (the closing price on/before that FY's 31 March\n    year-end) and `dividend_yield` (that FY's total dividend / that FY-end close) — None when no\n    price history reaches that far back yet.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"title":"Query","type":"string"},"years":{"default":5,"title":"Years","type":"integer"}},"required":["query"],"title":"get_dividendsArguments"}},{"name":"get_event_context","description":"Return cached prior-state context for a canonicalized filing event.\n\n    Use after get_filing_extract for an order, capacity or other supported event. The result\n    retains source quotes and reports only deterministic historical links; it does not infer\n    price correlation, business causality, or an investment conclusion. Cache-only: no fetches,\n    extraction requests, or writes occur on this tool path.\n\n    ``event_family`` additionally carries the persisted family TIMELINE — every cached filing in\n    this disclosure thread, in filing order — and ``open_questions`` lists the factual follow-ups\n    still unanswered by those filings (e.g. a required contract value the company has not\n    disclosed), each with the filing that raised it and, once answered, the filing that resolved\n    it. Both are raw, source-linked groupings of the company's own disclosures: never a verdict,\n    target, forecast or recommendation.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"title":"Query","type":"string"},"news_id":{"title":"News Id","type":"string"}},"required":["query","news_id"],"title":"get_event_contextArguments"}},{"name":"get_fii_activity","description":"DEPRECATED (issue #285) — renamed to `get_stock_fii_flow`; use that instead.\n\n    Kept as a thin back-compat alias for this release only (no removal date committed yet):\n    delegates to the exact same query function as `get_stock_fii_flow`, so the response is\n    byte-for-byte identical for the same arguments. See `get_stock_fii_flow`'s docstring for the\n    full parameter/behavior description.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"title":"Query","type":"string"},"days":{"default":90,"title":"Days","type":"integer"}},"required":["query"],"title":"get_fii_activityArguments"}},{"name":"get_fii_dii_flow","description":"DEPRECATED (issue #285) — renamed to `get_market_fii_dii_flow`; use that instead.\n\n    Kept as a thin back-compat alias for this release only (no removal date committed yet):\n    delegates to the exact same query function as `get_market_fii_dii_flow`, so the response is\n    byte-for-byte identical for the same arguments. See `get_market_fii_dii_flow`'s docstring for\n    the full parameter/behavior description.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"from_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"From Date"},"to_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"To Date"},"segment":{"default":"cash","title":"Segment","type":"string"}},"title":"get_fii_dii_flowArguments"}},{"name":"get_filing_extract","description":"Get the cached PDF-extraction for one BSE corporate filing. Accepts NSE symbol, ISIN,\n    or BSE code + a BSE news_id. Obtain the `news_id` from get_stock_events, which lists a\n    security's recent filings each carrying its `news_id`.\n\n    Returns cached grounded facts + a factual summary extracted from the filing PDF. On a cache\n    miss for any filing that has an attached PDF, calling this tool ENQUEUES on-demand extraction\n    and returns `status=\"pending\", queued=true` — call again in ~1-2 minutes to retrieve the facts\n    (works for ANY filing with a PDF, not a fixed doc-type list) — EXCEPT financial-results\n    filings, which return `not_queued` reason `results_available_via_financials` (+ a `see_instead`\n    pointer) because their figures come from XBRL via get_financials / get_financial_trends, not\n    PDF extraction. Every `pending` response carries a `reason_code` that stays consistent across\n    repeat polls of the same news_id: `on_demand_processing` (this tool's own trigger enqueued it\n    and it is still queued/running — keep polling), `auto_backfill_processing` (in flight via the\n    nightly sweep only, not this tool), or `awaiting_auto_backfill` (not yet queued, but eligible\n    for a future sweep). Other cache-miss statuses: `not_queued` reason `no_document_to_extract`\n    (no PDF), `not_queued` reason `on_demand_quota_exceeded` (authenticated caller hit its per-day\n    on-demand cap — retry tomorrow, or read `attachment_url` directly), or `failed` (retries\n    exhausted; see `error_reason`). Every cache-miss response includes `attachment_url` to read the\n    filing PDF directly. Raw disclosed facts with verbatim source quotes only — no verdicts,\n    targets, or recommendations.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"title":"Query","type":"string"},"news_id":{"title":"News Id","type":"string"}},"required":["query","news_id"],"title":"get_filing_extractArguments"}},{"name":"get_financial_trends","description":"Get multi-period growth and margin trends for an Indian stock.\n\n    Levels-vs-deltas division: this tool returns a PER-PERIOD time series (QoQ/YoY growth,\n    `net_margin_delta`, `fcf_growth`, and per-period reportable-segment breakdowns, one row\n    per displayed period) — not the latest levels or a summary growth/CAGR block. For the\n    current P&L/balance-sheet levels, TTM, and a single summary `growth` section (annual YoY\n    plus 3y/5y CAGR), see `get_financials` instead.\n\n    Accepts NSE symbol, ISIN, or BSE code. `period_type` is \"quarterly\" (default) or\n    \"annual\"; `limit` (1..12) caps the periods, newest first. Returns level fields plus\n    QoQ/YoY growth and margins — mechanically computed, no verdicts. Each period carries\n    `source` (`\"bse-xbrl\"` post-listing vs `\"drhp\"` pre-listing/prospectus-restated for a\n    newly-listed company); the envelope's own `source` is the shared value or `\"mixed\"`.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"title":"Query","type":"string"},"period_type":{"default":"quarterly","title":"Period Type","type":"string"},"limit":{"default":8,"title":"Limit","type":"integer"}},"required":["query"],"title":"get_financial_trendsArguments"}},{"name":"get_financials","description":"Get consolidated financials (P&L + balance sheet), TTM, and computed margins.\n\n    Accepts an NSE symbol, ISIN, or BSE code. `period_type` is \"quarterly\" (default) or\n    \"annual\". Banks/NBFCs/insurers return an interest-income template (NII / interest\n    income) instead of Revenue / EBITDA. Returns raw line items and mechanically-computed\n    ratios only — no valuation verdicts. Also includes a `growth` section (annual YoY plus\n    3y/5y CAGR for revenue / net income / EBITDA / EPS) — a single summary block layered on\n    top of these levels, NOT a per-period series; for a period-by-period QoQ/YoY growth,\n    margin-delta, and reportable-segment trend series instead, see `get_financial_trends`.\n    The `growth` section here is sign-aware (a loss base/endpoint is\n    Not Meaningful rather than a garbage %), EPS share-adjusted across splits/bonuses, with a\n    `base_effect` flag when a tiny prior-year base inflates the YoY. A `null` inside a present\n    growth metric (as opposed to the metric being absent, which means <2 annual periods are\n    cached) means the growth figure is Not Meaningful for that metric this period — most\n    commonly because the prior-year base (or a CAGR endpoint) was a loss, making a percentage\n    change mathematically undefined or misleading; it is not a data gap. When that is the\n    cause, a sibling `*_not_meaningful_reason` field (e.g. `yoy_not_meaningful_reason:\n    \"prior_period_loss\"`) makes it explicit rather than leaving the `null` to be misread as\n    \"no data available\".\n\n    Also carries three multi-period histories (independent of `period_type`/`limit` — always\n    the full annual history): `interest_coverage_history` (per-year interest-coverage trend,\n    general-only, omitted for banks/NBFCs/insurers or a newly-listed filer), `book_value_history`\n    (per-year book value per share plus a P/B \"band\" against the actual historical price near\n    each period, not general-only), and `working_capital_ratios` (always present: general filers\n    get inventory/receivable/payable days and cash conversion cycle when the latest annual inputs\n    are available; financial institutions receive an explicit not-applicable note).\n\n    Cash flow: each period carries `cash_flow_available` — Indian BSE-XBRL quarterly filings\n    never include a cash-flow statement (only annual filings do), so it is `false` on every\n    period for the default `period_type=\"quarterly\"`; a top-level `cash_flow_note` explains this\n    when no displayed period has cash-flow data. Call with `period_type=\"annual\"` for populated\n    `operating_cash_flow`/`free_cash_flow`/`capex` figures.\n\n    Provenance: each period carries `source` — `\"bse-xbrl\"` for a post-listing exchange filing,\n    or `\"drhp\"` for a newly-listed company's pre-listing years (restated figures from its IPO\n    prospectus, audited per SEBI ICDR requirements). The envelope's own `source` is the shared\n    value, or `\"mixed\"` when a window straddles both; a `drhp_periods_note` explains it further\n    whenever any displayed period is DRHP-sourced.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"title":"Query","type":"string"},"period_type":{"default":"quarterly","title":"Period Type","type":"string"},"limit":{"default":8,"title":"Limit","type":"integer"}},"required":["query"],"title":"get_financialsArguments"}},{"name":"get_fno_ban_list","description":"Get the full NSE F&O securities-in-ban list for the most-recently-published trading day.\n\n    Market-wide, not per-underlying — no `query` argument. This is the whole-list companion to\n    `get_derivatives_positioning`'s per-symbol `in_ban_list` flag: use this tool when you want\n    everything currently banned in one call, rather than checking symbols one at a time.\n\n    Returns `ban_date` (the snapshot's date) and `symbols` (one entry per banned name, each with\n    `nse_symbol` and `isin` — None for index names, which carry no security-master row). Raw\n    NSE-published ban list verbatim — no \"avoid these\" framing or interpretation (SEBI-RA line).\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"title":"get_fno_ban_listArguments"}},{"name":"get_fo_participant_activity","description":"Get NSE participant-wise (FII/DII/Pro/Client) F&O open interest & volume — market-wide.\n\n    `days` (1..366, default 30) bounds the trailing window. Each row is one (trade_date,\n    client_type) pair with raw long/short contract counts across futures-index, futures-stock,\n    options-index-call/put, and options-stock-call/put, for both `oi` and `volume`.\n\n    This is a DIFFERENT, derivatives-side signal from `get_market_fii_dii_flow`\n    (market-wide daily CASH-segment net flow) — it is the highest-confidence official\n    substitute for FII/DII derivatives positioning (NSE's cash-market feed does not cover\n    F&O). Raw counts only — no \"smart money\"/positioning-bias interpretation (SEBI-RA line).\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"days":{"default":30,"title":"Days","type":"integer"}},"title":"get_fo_participant_activityArguments"}},{"name":"get_fx_reference_rates","description":"Daily FBIL INR reference rates (USD/GBP/EUR/JPY/AED/IDR against INR).\n\n    `currency_pair` optionally filters to one pair (e.g. `\"USD/INR\"`, case-insensitive).\n    `from_date`/`to_date` are optional ISO dates (default: trailing 30 days). Each row is\n    `{rate_date, currency_pair, unit_base, rate, source}` — `rate` is always \"INR per\n    `unit_base` units of the foreign currency\" (unit_base is 1 for USD/GBP/EUR/AED, 100 for JPY,\n    10000 for IDR — FBIL's own published denomination, never silently rescaled). FBIL's public\n    feed only serves a rolling ~2-day window with no bulk history archive found, so a fresh\n    deploy accretes this table forward one scheduled refresh at a time — a wide window may\n    legitimately return far fewer rows than the window implies.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"currency_pair":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Currency Pair"},"from_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"From Date"},"to_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"To Date"}},"title":"get_fx_reference_ratesArguments"}},{"name":"get_index_valuation","description":"NSE's own daily OHLC + P/E + P/B + Div Yield time series for one named index.\n\n    `index` is matched case-insensitively against NSE's own published index names (e.g.\n    \"Nifty 50\", \"Nifty Bank\", \"Nifty IT\", \"Nifty Auto\", \"Nifty FMCG\", \"India VIX\" — use\n    get_india_vix for a VIX-specific shape). `from_date`/`to_date` are optional ISO dates\n    (default: trailing ~30 days; window capped at 1825 days). Sourced from NSE's own daily\n    `ind_close_all` file, which carries NSE's ALREADY-COMPUTED P/E, P/B, Div Yield for every\n    index it publishes — sector indices (Nifty Bank, Nifty IT, ...) give an official NSE\n    sector-valuation band, a DIFFERENT figure from get_sector_overview's peer-derived\n    median_pe/median_pb (this project's own aggregate over its tracked universe, grouped by a\n    different taxonomy) — the two are independent, neither validates the other. An unrecognized\n    `index` returns `reason_code: \"no_data\"` with `available_indices_hint` (every index name\n    NSE publishes) — see also list_index_valuations. Raw NSE-published figures only.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"index":{"title":"Index","type":"string"},"from_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"From Date"},"to_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"To Date"}},"required":["index"],"title":"get_index_valuationArguments"}},{"name":"get_india_vix","description":"NSE's daily India VIX (volatility index) OHLC time series.\n\n    `from_date`/`to_date` are optional ISO dates (default: trailing ~30 days; window capped at\n    1825 days). Each row is `{trade_date, open, high, low, close, points_change, pct_change}` —\n    VIX has no P/E, P/B, dividend yield, volume, or turnover, so those keys are omitted rather\n    than returned null. This is DalalOS's own NSE-sourced VIX series — if another connected MCP\n    server also exposes a similarly-named VIX tool, it is a DIFFERENT, non-interchangeable\n    source; prefer this one for anything joined against DalalOS's own index/sector data.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"from_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"From Date"},"to_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"To Date"}},"title":"get_india_vixArguments"}},{"name":"get_ipos","description":"List IPO/public-issue records: upcoming, open, listing pending, or recently listed.\n\n    `status` optionally filters to `upcoming`, `open`, `listing_pending`, or `listed` (omitted returns all four);\n    an unknown value is a bad_request. Unlike most fields, `status` is derived at READ TIME from\n    dates versus today (IST) and a listed-security match. A passed planned listing date without that evidence is `listing_pending`, never `listed`. `limit`\n    (1..500, default 100) caps the result. Each entry carries price band, face value, lot size,\n    issue size, open/close/listing dates, issue price, listing price (once listed), category-wise\n    subscription x-times (QIB/NII/Retail/Employee) where disclosed, a DRHP/prospectus link, and a\n    mechanically-computed `listing_gain_pct` = (listing_price - issue_price) / issue_price\n    (null pre-listing). Sourced from BSE (api.bseindia.com) and SEBI public-issue filings —\n    official sources only. No Grey Market Premium (GMP) field anywhere: GMP has no official\n    exchange source, so it is deliberately excluded (SEBI-RA line — raw facts and mechanical\n    arithmetic only, never a verdict).\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"status":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Status"},"limit":{"default":100,"title":"Limit","type":"integer"}},"title":"get_iposArguments"}},{"name":"get_macro_indicators","description":"Official macro/sector indicators: MOSPI CPI, WPI, IIP (monthly), GDP (annual), and PPAC's\n    Indian Basket crude-oil price (monthly).\n\n    `dataset` is required: `\"cpi\"` (headline Consumer Price Index by sector/division), `\"wpi\"`\n    (headline Wholesale Price Index — overall + food index only), `\"iip\"` (Index of Industrial\n    Production by category), `\"gdp\"` (GDP level + growth rate, current/constant prices, one\n    row per published estimate vintage — First/Second Advance, Provisional, Revised), or\n    `\"crude_basket\"` (PPAC's Indian Basket crude-oil monthly average price, USD/bbl). Any other\n    value is a `bad_request`. `from_period`/`to_period` bound the window (`\"YYYY-MM\"` for\n    cpi/wpi/iip/crude_basket, the fiscal-year string e.g. `\"2024-25\"` for gdp); `series_contains`\n    substring-filters `series_key` (e.g. `\"Food\"`, `\"Manufacturing\"`, `\"GDP Growth Rate\"`; a\n    no-op for crude_basket, which has only one series). `limit` (1..2000, default 200) caps the\n    result, newest period first. Raw published index values/growth percentages/commodity prices\n    only (SEBI-RA line) — no directional commentary (\"inflation is high\", \"oil is expensive\").\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"dataset":{"title":"Dataset","type":"string"},"from_period":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"From Period"},"to_period":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"To Period"},"series_contains":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Series Contains"},"limit":{"default":200,"title":"Limit","type":"integer"}},"required":["dataset"],"title":"get_macro_indicatorsArguments"}},{"name":"get_market_breadth","description":"Whole-market advance/decline/unchanged breadth: how many NSE-listed securities moved\n    up/down/flat on a trading day.\n\n    `from_date`/`to_date` are optional ISO dates (default: trailing ~30 days; window capped at\n    366 days). Each row is `{trade_date, advances, declines, unchanged, total}`, sourced from\n    NSE's own live market-data feed. NSE publishes no bulk historical archive for this figure,\n    so history only extends as far back as this server has been capturing it — an empty result\n    for a genuinely old date is expected, not a bug. Raw counts only — no \"risk-on/risk-off\" or\n    breadth-based market-direction commentary (SEBI-RA line).\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"from_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"From Date"},"to_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"To Date"}},"title":"get_market_breadthArguments"}},{"name":"get_market_calendar","description":"Get a unified, WHOLE-MARKET calendar of disclosed events across all NSE/BSE securities,\n    over an ARBITRARY window (past or future).\n\n    Use this instead of get_upcoming_results when you need a past window or multiple event types\n    together; use get_upcoming_results instead when you just want a forward results window with a\n    sector filter (a scoped convenience over the same results data this tool also reads). For ONE\n    company's historical corporate-action timeline, use get_corporate_actions instead — that tool\n    is per-stock; this one is market-wide.\n\n    `date_from`/`date_to` are ISO dates (YYYY-MM-DD); `date_to` must be on or after `date_from`\n    and the window is capped at 180 days. `types` optionally filters to a subset of `results,\n    dividend, split, bonus, demerger, ipo` (plus the remaining corporate-action disclosure\n    types: consolidation, rights, buyback, spinoff, merger, distribution, other) — an unknown\n    type is a bad_request. Each event is `{date, type, isin, nse_symbol, name, detail}`, merged\n    from results_calendar (results) and corporate_action_events (everything else) and sorted\n    chronologically; `limit` (1..2000, default 500) caps the merged result. `ipo` is a stub —\n    no IPO data source exists yet, so it always returns zero rows with an explanatory note.\n    Raw disclosed facts only — no verdicts, no importance ranking beyond your own type filter.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"date_from":{"title":"Date From","type":"string"},"date_to":{"title":"Date To","type":"string"},"types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Types"},"limit":{"default":500,"title":"Limit","type":"integer"}},"required":["date_from","date_to"],"title":"get_market_calendarArguments"}},{"name":"get_market_fii_dii_flow","description":"Market-wide DAILY FII/DII net cash-flow (Rs crore), NSE cash (Capital Market) segment.\n\n    NOT the shareholding data: get_shareholding gives per-company QUARTERLY FII/DII holding\n    PERCENTAGES; this gives market-wide DAILY net buy/sell/net value in Rs crore -- e.g. \"FIIs\n    net sold Rs 2,340 Cr, DIIs net bought Rs 1,890 Cr\" for a given trading day. `from_date`/\n    `to_date` are optional ISO dates (default: trailing ~30 days); `segment` is \"cash\" only.\n    For NSE participant-wise F&O positioning, use `get_fo_participant_activity`. Raw exchange-\n    published figures; `net = buy - sell` is the only computation (SEBI-RA line — no direction\n    calls or \"smart money\" framing).\n    The envelope's `source` reflects actual per-call provenance, not a fixed NSE label: recent\n    dates are NSE-live (`source=\"nse\"`), older dates are Moneycontrol-backfilled\n    (`source=\"moneycontrol\"`, since NSE publishes no bulk cash-history archive), and a query\n    window spanning both returns `source=\"mixed\"` (each row still carries its own accurate\n    `source`).\n\n    Renamed from `get_fii_dii_flow` (issue #285) so the name itself telegraphs scope\n    (MARKET-wide) against its get_sector_fii_flow/get_stock_fii_flow siblings.\n    `get_fii_dii_flow` is kept as a deprecated back-compat alias for this release.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"from_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"From Date"},"to_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"To Date"},"segment":{"default":"cash","title":"Segment","type":"string"}},"title":"get_market_fii_dii_flowArguments"}},{"name":"get_market_heatmap","description":"Get valuation + multi-horizon returns for the constituents of an Indian market index.\n\n    `index` is matched exactly to a known index name (e.g. NIFTY 50, NIFTY 500) — get the valid\n    names from list_indices. `limit` (1..500) caps the returned constituents, sorted by market\n    cap desc. Each row carries\n    market_cap/pe/pb plus precomputed 1d/1w/1m/3m/6m/1y returns, and any Tier-C\n    structural-event flags on those returns (`return_flags`) or a lack of price history\n    (`incomplete_windows`) — the two are mutually exclusive and together explain every null\n    return. Mechanical facts only — no rankings.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"index":{"title":"Index","type":"string"},"limit":{"default":100,"title":"Limit","type":"integer"}},"required":["index"],"title":"get_market_heatmapArguments"}},{"name":"get_peer_comparison","description":"Compare a stock against its sector/industry peers on valuation metrics.\n\n    Auto-identifies the peer group and returns a side-by-side table (Mkt Cap, PE, PB,\n    Revenue TTM, net / EBITDA margin, ROE, ROA, ROCE, interest coverage, D/E, the EV bundle\n    — EV, EV/EBITDA, EV/EBIT and the EV-based earnings yield — plus the cash-flow ratios\n    P/CF, P/FCF and FCF yield), sourced entirely from cache. EBITDA-margin and the EV bundle\n    are DELIBERATELY general-only (None for banks/NBFCs/insurers — an intentional validity-\n    matrix decision: EBIT/EBITDA are not meaningful add-backs for a financial's P&L). Cash-flow\n    ratios are NOT gated that way and populate for any peer disclosing an annual cash flow —\n    including banks/NBFCs/insurers. The one exception is bank capex specifically: P/FCF and FCF\n    yield are structurally unavailable for BANK peers whose only cached annual filing predates\n    the fix for issue #169 (banks tag capex under a different XBRL concept than the general\n    template; the mapping now covers it, but existing cached rows need a backfill re-scrape to\n    pick it up) — P/CF (which doesn't need capex) is unaffected either way.\n\n    Each row also carries `piotroski_f_score` (0-9, general-only; None for banks/NBFCs/\n    insurers) and `altman_z_score` (general-only; None for banks/NBFCs/insurers, and for a\n    general filer whenever any of the five classic-formula inputs is undisclosed for that\n    security). The explanatory text for WHY a score is None is never repeated per row — it is\n    deduplicated across the whole peer set and surfaced once at\n    `data.notes.{piotroski_f_score,altman_z_score}` (a list of the distinct reasons actually\n    present in the table). A row with an implausible figure (e.g. a corrupted\n    P/B or a unit-slipped market cap) is marked `valuation_suspect` and excluded from the\n    table-level `peer_medians`; a row within 52 weeks of a rights issue/demerger/merger is\n    marked `ratios_incomplete` (see the table-level `ratios_caveat`), and a row whose margins\n    are dominated by a one-off exceptional/discontinued item is marked `non_recurring_items`\n    (also excluded from `peer_medians`). `grain_widened`/`size_banded` indicate whether the\n    peer set fell back to the broader SEBI industry grain or was restricted by the market-cap\n    size band. Each row also carries `bvps` (book value per share, NOT general-only); the full\n    per-period BVPS + P/B history is get_financials-only.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"title":"Query","type":"string"},"limit":{"default":8,"title":"Limit","type":"integer"}},"required":["query"],"title":"get_peer_comparisonArguments"}},{"name":"get_pledge_trend","description":"Get the promoter share-pledge percentage trend for an Indian stock.\n\n    Accepts NSE symbol, ISIN, or BSE code. `limit` (1..16) caps the most-recent periods.\n    Returns the reported pledged-percentage time series. Raw disclosures only. Each period\n    carries `pledge_disclosed`: false means this quarter's pledge field wasn't present in the\n    underlying filing (a null `pledged_pct` reads as \"not disclosed\", not \"zero pledge\") — a\n    real 0.0 is only reported when `pledge_disclosed` is true.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"title":"Query","type":"string"},"limit":{"default":12,"title":"Limit","type":"integer"}},"required":["query"],"title":"get_pledge_trendArguments"}},{"name":"get_price_history","description":"Get the OHLC + volume price-history series for an Indian stock.\n\n    Accepts NSE symbol, ISIN, or BSE code. `days` (1..1825) bounds the lookback window.\n    Set `adjusted=True` for split/bonus-adjusted closes; default is raw close. `interval`\n    is 'daily' (default), 'weekly', or 'monthly' (weekly/monthly resample the adjusted\n    daily series). EOD from the NSE bhavcopy. `currency` is always \"INR\". Each bar carries\n    `sma_50` and `sma_200`, computed from daily adjusted/raw closes before resampling, plus a\n    mechanically-computed `vwap` (turnover / volume, None when either is missing/zero); vwap\n    is not rescaled by the split/bonus adjustment factor (turnover/volume are raw flow\n    figures, identical in raw and adjusted mode).\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"title":"Query","type":"string"},"days":{"default":90,"title":"Days","type":"integer"},"adjusted":{"default":false,"title":"Adjusted","type":"boolean"},"interval":{"default":"daily","title":"Interval","type":"string"}},"required":["query"],"title":"get_price_historyArguments"}},{"name":"get_relevant_peers","description":"Return an explainable peer set for operating, financial, or valuation comparison.\n\n    Uses reviewed, provenance-backed business tags and overrides plus cached factual metrics. The\n    existing get_peer_comparison table remains the broader SEBI-classification comparison. This\n    tool may return fewer peers when business-model evidence is insufficient; it never presents a\n    same-industry label as proof of comparability, and returns no investment conclusion.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"title":"Query","type":"string"},"purpose":{"default":"operating","title":"Purpose","type":"string"},"event_context":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Event Context"},"limit":{"default":8,"title":"Limit","type":"integer"}},"required":["query"],"title":"get_relevant_peersArguments"}},{"name":"get_returns","description":"Get mechanical return statistics over standard windows for an Indian stock.\n\n    Accepts NSE symbol, ISIN, or BSE code. Returns period returns (1W/1M/3M/6M/1Y/YTD/max),\n    CAGR, annualized volatility, max drawdown, and 52-week high/low — all computed from the\n    split/bonus-adjusted close series. A null return is always explained by exactly one of two\n    fields: `incomplete_windows` (not enough price history for that window yet) or\n    `corporate_action_flagged_windows` (a rights issue/demerger/spin-off/merger/bare\n    consolidation fell inside the window, so the window mixes a mechanical value transfer with\n    ordinary price movement and is nulled rather than reported — see `corporate_action_caveat`\n    when present). If the query only resolved via a rename/merger/demerger-successor alias,\n    the envelope carries `resolved_via` naming which kind fired. Descriptive statistics only;\n    no verdicts.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"title":"Query","type":"string"}},"required":["query"],"title":"get_returnsArguments"}},{"name":"get_sector_fii_flow","description":"Daily FII/FPI net flow (raw Rs), aggregated by sector -- the #74 sector-wise breakdown.\n\n    Scope-keyed alongside its siblings (issue #285): get_market_fii_dii_flow is market-wide\n    with no sector dimension; get_stock_fii_flow is per-stock; get_shareholding is per-company\n    QUARTERLY holding %. This is DAILY, per-sector, TRANSACTION flow, joined from the\n    stock-level fii_fpi_stock_flow table against securities.sector (the same sector field\n    get_company_profile/get_sector_overview use). `from_date`/`to_date` are optional ISO dates\n    (default: trailing ~30 days, capped at 366); `sector` optionally narrows to one sector name.\n    `net = buy - sell` is the only computation (SEBI-RA line).\n\n    COVERAGE CAVEAT: sourced from CDSL's Trade-Wise Equity Data of FII/FPI ONLY -- NSDL (India's\n    other depository) was confirmed unreachable and is not ingested, so this is a PARTIAL view\n    of FII/FPI activity by sector, not the whole market's figure (every response carries a\n    `coverage_note` saying so). CDSL itself publishes monthly bulk files, not daily/live.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"from_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"From Date"},"to_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"To Date"},"sector":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Sector"}},"title":"get_sector_fii_flowArguments"}},{"name":"get_sector_overview","description":"Get an aggregate market overview by sector (or a finer SEBI grain).\n\n    Omit `sector` to list all groups; pass one to drill in. `grain` is \"sector\" (default),\n    \"igroup\" (SEBI Industry), or \"isubgroup\" (SEBI Basic Industry, the finest grain). Returns\n    count, total market cap, and median/mean PE and median PB per group — computed from\n    cached quotes. Aggregates only.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"sector":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Sector"},"grain":{"default":"sector","title":"Grain","type":"string"}},"title":"get_sector_overviewArguments"}},{"name":"get_shareholding","description":"Get the promoter / FII / DII / public shareholding-pattern time series for a stock.\n\n    Accepts an NSE symbol, ISIN, or BSE code. `limit` caps the most-recent quarterly periods\n    (max 12). Returns raw reported ownership percentages — no verdicts. Sourced from cache;\n    returns an empty series with a note when no shareholding data is cached yet. `breakdown`\n    (when the underlying filing's raw payload was cached) carries the full BSE-SHP\n    institutional sub-category split as `breakdown.institutions`, a list of\n    `{\"category\": ..., \"pct\": ...}` — e.g. Mutual Funds, Insurance Companies, Alternate\n    Investment Funds, Provident/Pension Funds, Sovereign Wealth Funds, Foreign Portfolio\n    Investors Category I / II — separately from the headline `fii_pct`/`dii_pct` aggregates.\n    Category label strings are BSE's own text as filed (may contain formatting artifacts like\n    a trailing \"/\" or doubled spaces), not normalized. Omitted entirely for a period whose raw\n    payload wasn't cached. `breakdown.named_institutional_holders` lists individual FII/FPI,\n    insurance, and mutual-fund holders BSE's filing names once they cross the Reg 31 reporting\n    threshold — `{\"name\": ..., \"category\": ..., \"pct\": ...}` per holder — so a caller can see\n    who specifically holds a stake, not just the category total.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"title":"Query","type":"string"},"limit":{"default":8,"title":"Limit","type":"integer"}},"required":["query"],"title":"get_shareholdingArguments"}},{"name":"get_stock_events","description":"Get recent BSE corporate announcements (SEBI Reg-30 disclosures) for an Indian stock.\n\n    Accepts NSE symbol, ISIN, or BSE code. `days` (1..365, default 30) bounds the trailing\n    window over filing date; `category` optionally narrows to one BSE category (e.g.\n    \"Board Meeting\", or \"Insider Trading / SAST\" for promoter/KMP insider buy-sell and pledge\n    creation/invocation/revocation disclosures). Returns disclosure metadata — subject, headline,\n    category, filing time, and a link to the source PDF on BSE. Metadata only; the filings\n    themselves are not parsed or summarised. Quarterly results aren't here — use get_financials\n    for those. Capped at 200 rows; `truncated: true` means more filings matched the window than\n    were returned (narrow `days`/`category` to see the rest) — `total_scanned` reports the true\n    match count, uncapped.\n\n    Each event includes a `news_id` (the BSE filing GUID). To read the extracted facts and a\n    factual summary of a specific filing, pass that `news_id` to get_filing_extract.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"title":"Query","type":"string"},"days":{"default":30,"title":"Days","type":"integer"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Category"}},"required":["query"],"title":"get_stock_eventsArguments"}},{"name":"get_stock_fii_flow","description":"Per-stock DAILY FII/FPI transaction flow (raw Rs) -- daily series + trailing-30d summary.\n\n    Accepts NSE symbol, ISIN, or BSE code. `days` (1..1825, default 90) bounds the daily\n    `series`; `summary` is always the trailing-30d figure (the SAME single-source helper\n    get_company_profile's compact `fii_activity` field uses). A distinct FII/FPI surface from\n    get_market_fii_dii_flow (market-wide) and get_shareholding (quarterly holding %) -- this is\n    per-STOCK daily transaction flow, aggregated from CDSL's trade-wise disclosure.\n\n    COVERAGE CAVEAT: CDSL-only (NSDL unreachable, not ingested) -- every response carries a\n    `coverage_note`. `net = buy - sell` is the only computation (SEBI-RA line: no direction\n    calls, no \"smart money\" framing).\n\n    Renamed from `get_fii_activity` (issue #285) so the name carries \"flow\" like its\n    get_sector_fii_flow/get_market_fii_dii_flow siblings (\"activity\" gave no scope cue).\n    `get_fii_activity` is kept as a deprecated back-compat alias for this release.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"title":"Query","type":"string"},"days":{"default":90,"title":"Days","type":"integer"}},"required":["query"],"title":"get_stock_fii_flowArguments"}},{"name":"get_stock_quote","description":"Get the latest end-of-day quote (price, OHLC, volume) for an Indian stock.\n\n    Accepts an NSE symbol, ISIN, or BSE code. Prices are EOD from the NSE bhavcopy. Carries\n    `currency` (\"INR\") and a mechanically-computed `vwap` (turnover / volume for the latest\n    bar, None when either is missing/zero). P/E and P/B may be null with a `valuation_notes`\n    explanation (e.g. negative shareholders' equity, or a proven loss) rather than a\n    misleading ratio. A `ratios_caveat` field and/or a `week52_adjustments` list appear when a\n    split, bonus, or other corporate action in the trailing 52 weeks affects the comparability\n    of the 52-week range or valuation ratios. `recent_dividends` / `upcoming_dividends` /\n    `dividend_yield` carry realized cash-dividend history and trailing yield. Always check\n    these fields before restating a figure as clean.\n\n    A `bse_reported` sub-object, when present, carries BSE's OWN published ROE/operating margin/\n    net margin — a DIFFERENT, BSE-computed figure (not necessarily TTM or the same\n    consolidated/standalone basis) from this project's XBRL-derived ratios elsewhere. It is a\n    cross-check/fallback signal only — never treat it as the same number as a computed `roe`.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"title":"Query","type":"string"}},"required":["query"],"title":"get_stock_quoteArguments"}},{"name":"get_technical_indicators","description":"Get moving averages, RSI, MACD, Bollinger Bands, beta, and circuit-filter band/hit-days\n    for an Indian stock.\n\n    Accepts NSE symbol, ISIN, or BSE code. Moving averages (sma_50/sma_100/sma_200), `rsi_14`\n    (Wilder's 14-period RSI), `macd` (12/26/9 EMA line/signal/histogram), `bollinger_bands`\n    (20-day, 2-stdev middle/upper/lower + percent_b), and `beta` (regressed against NSE's own\n    Nifty 50 daily close series over the trailing ~1Y of paired trading days; `beta_benchmark`\n    names it) are all mechanically computed from the split/bonus-adjusted daily close series.\n\n    `circuit_band_pct`/`circuit_band_as_of`/`circuit_hit_days` use the RAW (unadjusted) close\n    series and are NSE's own per-security circuit-filter data, not derived from bhavcopy. NSE\n    publishes only a CURRENT snapshot with no historical archive, so this pipeline's own daily\n    captures are the only source of band history and only exist from whenever this deployment\n    started capturing them:\n    * `circuit_band_pct` is null for TWO DIFFERENT reasons — check `circuit_band_as_of` to tell\n      them apart. `circuit_band_as_of` present + `circuit_band_pct` null means this security\n      genuinely has NSE's \"No Band\" designation (no static daily price band applies — typically\n      a large/liquid, F&O-eligible name; this is a complete, real answer, NOT missing data).\n      `circuit_band_as_of` null means no band has been captured for this security AT ALL yet\n      (also named in `insufficient_history`) — do not conflate the two.\n    * `circuit_hit_days` is a list of `{trade_date, close, prev_close, pct_change, band_pct}`\n      for RAW-close days that plausibly touched that day's captured band (a small tolerance\n      absorbs NSE's tick-size rounding of the actual limit price off the raw percentage) — a\n      descriptive flag that trading was likely constrained that day, not a claim about why.\n    An indicator needing more history than is cached yet (e.g. sma_200 on a recently-listed\n    stock, beta when too few dates overlap the Nifty 50 series, or circuit-band data for a\n    security with no captured band day yet) is null/empty and named in `insufficient_history`\n    rather than computed or fabricated on a short series. Pure math, no verdicts/signals.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"title":"Query","type":"string"}},"required":["query"],"title":"get_technical_indicatorsArguments"}},{"name":"get_top_movers","description":"Raw ranked gainers/losers/most-active for an index over one completed EOD session.\n\n    `index` defaults to 'NIFTY 500' — get valid names from list_indices. `metric` picks the raw\n    sort field: 'pct_change' (day % change, default), 'change' (absolute price change, Rs),\n    'turnover' (traded value, Rs), or 'volume' (traded quantity). `direction` is 'desc' (default\n    — top gainers / most active) or 'asc' (top losers). `limit` (1..100, default 20) caps the\n    rows. This is the same mechanical fact NSE's own top-gainers/losers page publishes — a\n    caller-chosen sort key over already-public EOD numbers, nothing more.\n    Distinct from get_market_heatmap, which is deliberately NOT sortable by return (issue #85)\n    and instead always sorts by market cap — use get_market_heatmap for a valuation+returns\n    snapshot, use this tool when the question is specifically \"what moved most today\".\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"index":{"default":"NIFTY 500","title":"Index","type":"string"},"metric":{"default":"pct_change","title":"Metric","type":"string"},"direction":{"default":"desc","title":"Direction","type":"string"},"limit":{"default":20,"title":"Limit","type":"integer"}},"title":"get_top_moversArguments"}},{"name":"get_upcoming_results","description":"List companies with an upcoming board-meeting / results date — WHOLE-MARKET, FORWARD-ONLY.\n\n    This is a forward-only, sector-filterable CONVENIENCE view over the same results_calendar\n    data get_market_calendar also reads — equivalent to get_market_calendar(date_from=today,\n    date_to=today+days, types=[\"results\"]) plus the sector narrowing get_market_calendar doesn't\n    offer, not a competing source. Prefer get_market_calendar instead when you need a past window\n    or multiple event types together. For ONE company's historical corporate-action timeline\n    (splits/bonuses/dividends), use get_corporate_actions instead.\n\n    `days` (1..90, default 14) is the forward window; `sector` optionally filters; `limit`\n    (1..200) caps the results. Each entry carries the meeting date and security identifiers.\n    A disclosed meeting is never dropped just because its bse_code doesn't join cleanly to\n    the securities master; such rows keep the raw bse_code and add a `note` explaining why\n    isin/nse_symbol/name/sector are null.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"days":{"default":14,"title":"Days","type":"integer"},"sector":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Sector"},"limit":{"default":50,"title":"Limit","type":"integer"}},"title":"get_upcoming_resultsArguments"}},{"name":"get_valuation_history","description":"Get point-in-time P/E and price-to-sales history for an Indian stock.\n\n    Each point uses only the TTM filing that was public on that trade date. `days` accepts\n    1..1825; `interval` is daily, weekly, or monthly. P/S is null where the filing lacks a\n    usable top line or disclosed share count. Cache-only, mechanically computed, no verdicts.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"title":"Query","type":"string"},"days":{"default":365,"title":"Days","type":"integer"},"interval":{"default":"daily","title":"Interval","type":"string"}},"required":["query"],"title":"get_valuation_historyArguments"}},{"name":"get_watchlist","description":"Get the caller's DalalOS watchlist: bare stock symbols, no quantity/cost-basis.\n\n    Use this whenever the user asks what's on their (DalalOS) watchlist, or before adding/\n    removing symbols to check current state. This is DalalOS's OWN watchlist, tied to the\n    caller's DalalOS account -- if another connected MCP server also has a watchlist tool, it is\n    a SEPARATE list; do not treat them as interchangeable.\n\n    Requires an authenticated caller (API key or OAuth session tied to a DalalOS account) --\n    unauthenticated or auth-disabled deployments get an `unauthorized`/`not_configured` error\n    envelope instead of data. Each entry is decorated with `name`/`sector`/`market_cap` (best\n    effort, via the same lookup `get_company_profile` uses) alongside the bare `symbol` and\n    `added_at`; a symbol that no longer resolves (delisted, renamed) still returns as a bare row\n    rather than failing the whole call.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"title":"get_watchlistArguments"}},{"name":"list_announcement_buckets","description":"List the market-wide BSE announcement discovery buckets (id + label).\n\n    Each bucket groups a real-world disclosure type (e.g. \"order-receipts\", \"fundraise\",\n    \"credit-rating\", \"acquisitions\", \"management-changes\") across the WHOLE market — the inverse\n    of get_stock_events, which is scoped to one company. Pass a bucket id to\n    get_announcement_bucket to fetch its recent filings.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"title":"list_announcement_bucketsArguments"}},{"name":"list_index_constituents","description":"List the constituent stocks of an Indian market index (e.g. NIFTY 50, NIFTY 500).\n\n    `index` is matched exactly to a known index name — get the valid names from list_indices.\n    `limit` (1..500) caps the returned constituents. Returns the member securities with\n    identifiers (each `nse_symbol`/`isin` can be passed as the `query` to any per-stock tool).\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"index":{"title":"Index","type":"string"},"limit":{"default":100,"title":"Limit","type":"integer"}},"required":["index"],"title":"list_index_constituentsArguments"}},{"name":"list_index_valuations","description":"List every NSE index name tracked (headline, broad-market, sector/thematic, India VIX).\n\n    Each entry carries `{index_name, latest_trade_date, latest_close}`. Powers\n    get_index_valuation's `available_indices_hint` and lets you discover NSE's exact\n    index-name spelling before calling it.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"title":"list_index_valuationsArguments"}},{"name":"list_indices","description":"List the market indices for which constituent membership is cached.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"title":"list_indicesArguments"}},{"name":"list_preset_screens","description":"List the fixed, nightly-precomputed preset screens (name/description/cache freshness).\n\n    Presets are FIXED mechanical filter combinations (never live-queried, never ranked or\n    labelled as a recommendation) — a discovery starting point a caller can further filter via\n    screen_stocks itself. Use run_preset_screen(name) to fetch one preset's actual results.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"title":"list_preset_screensArguments"}},{"name":"ping","description":"DalalOS health check. Returns a success envelope to confirm the server is reachable.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"title":"pingArguments"}},{"name":"remove_from_watchlist","description":"Remove one or more stock symbols from the caller's DalalOS watchlist in a single call.\n\n    Use this when the user says \"stop watching X\", \"remove X from my watchlist\", or \"clear my\n    watchlist\" (call get_watchlist first, then pass every returned symbol here in one call).\n    This is DalalOS's OWN watchlist -- see add_to_watchlist's docstring for why that\n    distinction matters when multiple MCP servers are connected.\n\n    `symbols` accepts either a list of strings (mirrors `add_to_watchlist`, capped at\n    `watchlist_tool.MAX_WATCHLIST_BATCH`) or a single bare string (kept for one release for\n    backward compatibility with older single-symbol callers). A partial match -- some symbols\n    on the watchlist, some not -- never fails the call: the response reports\n    `{\"removed\": [...], \"not_found\": [...]}` so the caller can see exactly which symbols were\n    actually removed. Requires an authenticated caller; see `get_watchlist` for the auth error\n    shape.\n    ","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"symbols":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}],"title":"Symbols"}},"required":["symbols"],"title":"remove_from_watchlistArguments"}},{"name":"run_preset_screen","description":"Return the last nightly-precomputed result for one registered preset screen.\n\n    `name` must be one of the names returned by list_preset_screens. A preset that has never\n    been computed yet returns an empty result with reason_code \"no_data\". Cache-only — this is\n    the stored output of an equivalent screen_stocks(filters=...) call, not a live query.\n    ","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"title":"Name","type":"string"}},"required":["name"],"title":"run_preset_screenArguments"}},{"name":"screen_by_query","description":"Screen the Indian security universe with one free-form Screener.in-style expression.\n\n    Reach for this instead of screen_stocks when the ask needs OR, arithmetic between two\n    metrics, or a comparison screen_stocks' fixed `<metric>_min`/`_max` keys cannot express — e.g.\n    `Return on capital employed > 22% AND (Debt to equity < 0.5 OR Interest Coverage Ratio > 8)`.\n    screen_stocks stays the right tool for a plain AND-combined set of range filters.\n\n    `dialect` picks the vocabulary and is never guessed: \"screener\" (default) reads Screener.in\n    ratio names in the units Screener DISPLAYS — `> 22%` against a ratio stored as a fraction,\n    market cap in crore — while \"dalalos\" reads canonical DalalOS metric ids in the units the\n    cache stores. The metric catalogue for both is GET /v1/ratios; an unrecognised name comes\n    back as an explicit error naming the phrase, never a silent substitution.\n\n    Operators: AND, OR, = != > < >= <=, + - * /, and COALESCE, IF, LEAST, POWER, ABS,\n    SQRT, LOG. Missing values follow SQL three-valued logic: a bare comparison against an\n    unknown value does NOT match, `COALESCE(<metric>, 0) > x` does, and `A > x OR B > y` can\n    still match on the right side alone. Division by zero is a missing value, not an error.\n\n    Paging is pinned to one published metrics generation. Each response reports it as\n    `pagination.snapshot_id`; pass that value back as `snapshot_id` on the next page. If a\n    metrics refresh published a new generation in between, the call fails with\n    `snapshot_expired` and the current generation rather than mixing rows from two of them —\n    restart from `offset` 0. `sort_by` is a sortable metric id; ordering puts unknown values\n    last and ends with an ISIN tie-break, so pages never duplicate or skip a row.\n\n    Returns matching securities with the screened metrics — data only, no recommendations.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"title":"Query","type":"string"},"dialect":{"default":"screener","title":"Dialect","type":"string"},"sort_by":{"default":"market_cap","title":"Sort By","type":"string"},"order":{"default":"desc","title":"Order","type":"string"},"limit":{"default":25,"title":"Limit","type":"integer"},"offset":{"default":0,"title":"Offset","type":"integer"},"snapshot_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Snapshot Id"},"definitions":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"default":null,"title":"Definitions"},"columns":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Columns"},"scope":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"title":"Scope"},"only_latest_results":{"default":false,"title":"Only Latest Results","type":"boolean"}},"required":["query"],"title":"screen_by_queryArguments"}},{"name":"screen_stocks","description":"Screen the Indian security universe by user-supplied mechanical criteria.\n\n    All `filters` keys are optional and AND-combined. `sort_by`/`order` order the result set;\n    `limit` (1..100) caps it. Returns matching securities with the screened metrics — data\n    only, no recommendations. An unknown filter key returns a `bad_request` error that lists\n    every accepted key verbatim, so a rejected call is always self-correcting.\n\n    RANGE filters (take a `_min` and/or `_max` suffix, e.g. `pe_min: 10, pe_max: 20`):\n      market_cap, price, pe, pb, deliv_pct, week52_high, week52_low, turnover, num_trades\n      (quote-level) — deliv_pct is a PERCENTAGE (50 = 50%); week52_high/week52_low are rupee\n      price levels comparable to `price`; turnover is a rupee traded-value, num_trades a count.\n      promoter_pct, pledged_pct — PERCENTAGES (pass 50 for \"50%\"), from shareholding data.\n      roe, roa, roce, net_margin, dividend_yield, earnings_yield, fcf_yield, ebitda_margin,\n      operating_margin, quarterly_net_margin_delta_yoy — FRACTIONS (pass 0.15 for \"15%\").\n      interest_coverage, ev, ev_to_ebitda, ev_to_ebit, price_to_cash_flow, price_to_fcf,\n      debt_to_equity, price_to_sales, piotroski_f_score (0-9) — plain multiples/scores, no\n      unit conversion needed.\n      revenue_growth, net_income_growth, quarterly_revenue_growth_yoy,\n      quarterly_net_income_growth_yoy, return_1d/1w/1m/3m/6m/1y — FRACTIONS (0.20 = 20% growth\n      or return); unlike the margin/yield group above, these may legitimately exceed 1.0\n      (>100%) for high-growth or multi-bagger names.\n      pct_off_52w_low — derived, FRACTION: (price - week52_low) / week52_low, e.g.\n      `pct_off_52w_low_max=0.05` for \"within 5% of its 52-week low\".\n      num_shareholders (a count) and promoter/fii/dii/public_holding_change_qoq — PERCENTAGE POINTS between the latest two shareholding filings (50% -> 55% is 5, not 0.10) — plus num_shareholders_change_qoq, a plain count difference. A\n      security with only one filed period is EXCLUDED, never matched as a zero change.\n      revenue_cagr_3y/5y, net_income_cagr_3y/5y — 3Y/5Y sales and profit CAGR, FRACTIONS.\n      roe_weighted_avg_3y/5y, roce_weighted_avg_3y/5y — multi-year return on equity /\n      capital employed, FRACTIONS, computed as sum(numerators)/sum(denominators) over the\n      window (denominator-WEIGHTED, not the average of the yearly ratios). All eight are\n      null unless that many annual periods are cached; the 5Y horizons are null for most\n      names today.\n      sales_growth_ttm, profit_growth_ttm — TTM vs the preceding TTM, FRACTIONS, and like the\n      other growth rates they may legitimately exceed 1.0. roa_last_year — last ANNUAL\n      profit over average assets (roa's trailing-twelve-month sibling), a FRACTION.\n      opm_ex_other_income — operating margin on the Schedule-III Sales-minus-Expenses\n      subtotal, so it EXCLUDES other income, a FRACTION; operating_margin keeps its EBIT\n      basis. roce_ex_exceptional — roce with the pre-tax exceptional item removed, a\n      FRACTION. pe_ex_exceptional — market cap over TTM profit with the after-tax\n      exceptional item removed, a multiple; the headline pe keeps its own basis.\n      price_to_fcf_3y_avg — market cap over 3-year-average free cash flow, a multiple.\n      inventory_days_material_cost, payable_days_material_cost — DAYS, on a material-cost\n      denominator rather than full COGS. working_capital_ex_st_borrowings — RUPEES, with\n      short-term borrowings netted out. Each of these stands BESIDE the DalalOS metric of\n      the same family rather than replacing it, so both bases are screenable.\n\n    EXACT-MATCH filters (single value, no `_min`/`_max`):\n      sector, industry, igroup, isubgroup, company_type (e.g. \"bank\", \"nbfc\", \"insurer\",\n      \"general\"), index (e.g. \"NIFTY 50\" — membership in that index's constituent list).\n\n    BOOLEAN filter (a bare true/false, no `_min`/`_max`):\n      is_sme — listed on an SME platform (NSE Emerge). THREE-VALUED: a security whose listing\n      segment is unverified matches neither is_sme=true nor is_sme=false, because no\n      official machine-readable BSE SME membership list exists.\n\n    Some derived metrics are general-only (null for bank/nbfc/insurer): roce,\n    interest_coverage, ev*, earnings_yield, ebitda_margin, operating_margin,\n    piotroski_f_score, roce_weighted_avg_3y/5y, opm_ex_other_income,\n    roce_ex_exceptional, inventory_days_material_cost, payable_days_material_cost.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"filters":{"additionalProperties":true,"title":"Filters","type":"object"},"sort_by":{"default":"market_cap","title":"Sort By","type":"string"},"order":{"default":"desc","title":"Order","type":"string"},"limit":{"default":25,"title":"Limit","type":"integer"}},"required":["filters"],"title":"screen_stocksArguments"}},{"name":"search_company_disclosures","description":"Search this company's already cached official filings, page by page.\n\n    Use after get_stock_events/get_filing_extract when you need historical context, such as a\n    prior commissioning date, original order announcement, customer, project, or tender. This is\n    cache-only: it never downloads a filing or triggers extraction. Results retain a source page\n    and original BSE attachment URL; `coverage` tells you how much page-preserving history is\n    indexed and explicitly reports parsed legacy filings that cannot be searched reliably yet.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"title":"Query","type":"string"},"search_text":{"title":"Search Text","type":"string"},"from_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"From Date"},"to_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"To Date"},"document_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Document Types"},"limit":{"default":10,"title":"Limit","type":"integer"}},"required":["query","search_text"],"title":"search_company_disclosuresArguments"}},{"name":"search_stocks","description":"Find Indian stocks by company name, NSE symbol, BSE code, or ISIN.\n\n    Returns matching securities with their ISIN, internal company_id, name, and both\n    exchange codes. Use this first when a ticker is unknown or ambiguous, then pass a returned\n    `nse_symbol` / `isin` / BSE code as the `query` argument to any other per-stock tool.\n    Tolerant matching: a company-name/symbol typo still surfaces a suggestion, a truncated/\n    partial ISIN or BSE code matches via prefix, and a former/retired name or symbol (e.g. a\n    pre-rename company name) resolves to the security's current identity, with `resolved_via`\n    on the result naming which kind of resolution fired.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"title":"Query","type":"string"},"limit":{"default":10,"title":"Limit","type":"integer"}},"required":["query"],"title":"search_stocksArguments"}}],"scan":{"score":55,"grade":"C","scanned_at":"2026-09-25T17:23:46.621Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-25T17:23:46.615Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 1700ms"]},"poisoning":{"score":13,"max":15,"notes":["60 tool descriptions checked"]},"auth":{"score":3,"max":15,"notes":["open endpoint exposes 2 write-action tools with no auth"]},"maintenance":{"score":3,"max":15,"notes":["repository not readable: repo not found"]},"identity":{"score":2,"max":10,"notes":["no repository or website to verify"]}},"findings":[{"id":"auth.open-write","severity":"high","component":"auth","title":"Write-action tools reachable without authentication"},{"id":"poison.long-description","severity":"low","component":"poisoning","title":"Unusually long tool description (over 2,000 characters)","evidence":"tool get_financials: …Get consolidated financials (P&L + balance sheet), TTM, and computed margins. Accepts an NSE symbol, ISIN, or BSE code. `period_type` is \"quarterly\" (default) or \"annual\". Banks/NBFCs/insurers return an interest-income template (NII / interest income) instead of Revenue / EBITDA. Returns raw line items and mechanically-computed ratios only — no valuation verdicts. Also includes a `growth` section (annual YoY plus 3y/5y CAGR for revenue / net income / EBITDA / EPS) — a single summary block layered on top of these levels, NOT a per-period series; for a period-by-period QoQ/YoY growth, margin-delta, and reportable-segment trend series instead, see `get_financial_trends`. The `growth` section here is sign-aware (a loss base/endpoint is Not Meaningful rather than a garbage %), EPS share-adjusted across splits/bonuses, with a `base_effect` flag when a tiny prior-year base inflates the YoY. A `null` inside a present growth metric (as opposed to the metric being absent, which means <2 annual periods are cached) means the growth figure is Not Meaningful for that metric this period — most commonly because the prior-year base (or a CAGR endpoint) was a loss, making a percentage change mathematically undefined or misleading; it is not a data gap. When that is the cause, a sibling `*_not_meaningful_reason` field (e.g. `yoy_not_meaningful_reason: \"prior_period_loss\"`) makes it explicit rather than leaving the `null` to be misread as \"no data available\". Also carries three multi-period histories (independent of `period_type`/`limit` — always the full annual history): `interest_coverage_history` (per-year interest-coverage trend, general-only, omitted for banks/NBFCs/insurers or a newly-listed filer), `book_value_history` (per-year book value per share plus a P/B \"band\" against the actual historical price near each period, not general-only), and `working_capital_ratios` (always present: general filers get inventory/receivable/payable days and cash conversion cycle when the latest annual inputs are available; financial institutions receive an explicit not-applicable note). Cash flow: each period carries `cash_flow_available` — Indian BSE-XBRL quarterly filings never include a cash-flow statement (only annual filings do), so it is `false` on every period for the default `period_type=\"quarterly\"`; a top-level `cash_flow_note` explains this when no displayed period has cash-flow data. Call with `period_type=\"annual\"` for populated `operating_cash_flow`/`free_cash_flow`/`capex` figures. Provenance: each period carries `source` — `\"bse-xbrl\"` for a post-listing exchange filing, or `\"drhp\"` for a newly-listed company's pre-listing years (restated figures from its IPO prospectus, audited per SEBI ICDR requirements). The envelope's own `source` is the shared value, or `\"mixed\"` when a window straddles both; a `drhp_periods_note` explains it further whenever any displayed period is DRHP-sourced. …"}],"inputs":{"probes":[{"url":"https://mcp.dalalos.in/mcp","reachable":true,"authRequired":false,"latencyMs":1700,"serverInfo":{"name":"dalalos","version":"1.28.1"}}],"packages":[],"repo":{"found":false,"owner":"BeyondNoww","repo":"indianstock-data-mcp","error":"repo not found"},"icon":{"url":null,"source":"none"},"presence":{"stars":null,"forks":null,"downloadsWeek":null,"license":null,"lastPushAt":null,"score":5}}}},"grade_history":[],"reviews":[]}