Skip to content

Use case · Stock screener

Is there an Indian stock screener I can use through an MCP server?

Disclosure: DalalOS publishes this page and runs the MCP server it describes. We checked every figure below against the live server on 29 October 2026.

Yes. DalalOS has four screener tools. screen_stocks takes numeric filters and combines them with AND. screen_by_query takes one free-form expression that can use OR and arithmetic. list_preset_screens and run_preset_screen return fixed screens computed each night. A screen returns a list of companies that match your criteria. It does not pick stocks for you.

Connect your AI

Free to start, no card needed. Sign in once from your AI — no API key to manage.

KEY TAKEAWAYS

  • Use screen_stocks for plain AND filters, and screen_by_query for OR or arithmetic between ratios.
  • Units differ by tool and dialect. In screen_stocks, ROCE is a fraction (0.2 is 20 percent). The default query dialect reads 22% as 22 percent.
  • Results are a filtered list sorted by market cap unless you choose another column. Order is not a ranking.

What are the four screener tools?

DalalOS screener tools, checked on 29 October 2026
ToolUse it forInput
screen_stocksPlain numeric criteria combined with AND, plus exact-match filters such as sector, company_type and indexA filters object, sort_by, order and limit up to 100
screen_by_queryOR logic, arithmetic between ratios, functionsOne expression, a dialect, limit, offset and snapshot_id
list_preset_screensSee the ready-made screens and when each was computedNone
run_preset_screenFetch the stored result of one presetA preset name from the list

How does a filter screen work?

You pass filters as keys. A range filter takes a _min or _max suffix, such as pe_max or roce_min. An unknown key returns an error that lists every accepted key. We ran roce_min 0.2 and debt_to_equity_max 0.5 on 29 October 2026. The server scanned 5,293 securities, excluded 1,923 for a missing metric and matched 607. The five rows below are the first five by market cap. They are the start of a longer list and not a shortlist.

screen_stocks · roce_min 0.2 · debt_to_equity_max 0.5 · 29 Oct 2026
{
  "filters": { "roce_min": 0.2, "debt_to_equity_max": 0.5 },
  "sort_by": "market_cap",
  "order": "desc",
  "match_count": 607,
  "total_scanned": 5293,
  "excluded_missing_metric": 1923,
  "results": [
    { "nse_symbol": "TCS",        "market_cap": 8905200000000.0, "pe": 17.2462, "roce": 0.6965, "debt_to_equity": 0.0 },
    { "nse_symbol": "INFY",       "market_cap": 4551003800000.0, "pe": 14.8388, "roce": 0.4511, "debt_to_equity": 0.0 },
    { "nse_symbol": "HINDUNILVR", "market_cap": 4267130000000.0, "pe": 40.3153, "roce": 0.2978, "debt_to_equity": 0.0003 },
    { "nse_symbol": "SUNPHARMA",  "market_cap": 4216769750000.0, "pe": 34.871,  "roce": 0.2029, "debt_to_equity": 0.0488 },
    { "nse_symbol": "HCLTECH",    "market_cap": 3802357500000.0, "pe": 20.6869, "roce": 0.3334, "debt_to_equity": 0.0125 }
  ],
  "snapshot": { "id": 70, "computed_at": "2026-10-28 16:16:45" },
  "cached_at": "2026-10-28T14:45:03+00:00"
}

Trimmed from the live response: 5 of 607 rows shown with fewer fields, no value changed. Market cap is in whole rupees.

How does a query with OR work?

screen_by_query reads one expression. Operators are AND, OR, comparison symbols and + - * /, with functions such as COALESCE, IF, LEAST, POWER, ABS, SQRT and LOG. On 29 October 2026 we ran a query with an OR inside brackets. It matched 543 companies, and the response gave the first five by market cap. All five satisfied both sides of the OR.

screen_by_query · OR expression · 29 Oct 2026
query: Return on capital employed > 22% AND (Debt to equity < 0.5 OR Interest Coverage Ratio > 8)
dialect: screener, sort_by: market_cap, order: desc, limit: 5

{
  "results": [
    { "nse_symbol": "TCS",        "roce": 0.6965, "debt_to_equity": 0,      "interest_coverage": 52.9744 },
    { "nse_symbol": "INFY",       "roce": 0.4511, "debt_to_equity": 0,      "interest_coverage": 96.9385 },
    { "nse_symbol": "HINDUNILVR", "roce": 0.2978, "debt_to_equity": 0.0003, "interest_coverage": 46.6869 },
    { "nse_symbol": "HCLTECH",    "roce": 0.3334, "debt_to_equity": 0.0125, "interest_coverage": 33.9516 },
    { "nse_symbol": "ITC",        "roce": 0.3657, "debt_to_equity": 0.0302, "interest_coverage": 244.1047 }
  ],
  "pagination": { "limit": 5, "offset": 0, "returned": 5, "total_matches": 543, "has_more": true, "snapshot_id": 70 },
  "snapshot": { "id": 70, "computed_at": "2026-10-28 16:16:45" },
  "compatibility": { "dialect": "screener", "diagnostics": [] }
}

Trimmed from the live response: 5 of 543 rows shown with fewer fields, no value changed.

The two screens used different criteria, so their match counts (607 and 543) are not comparable. The query also used ROCE above 22 percent where the filter screen used 20 percent.

What are the dialects and units?

  • screener (default). Ratio names as a screener page shows them, in displayed units. Market cap is in crore and Return on capital employed > 22% means 22 percent.
  • dalalos. Canonical DalalOS ids in stored units. Percentages are fractions, so ROCE above 22 percent is roce > 0.22. Market cap is in whole rupees.
  • screen_stocks. ROE, ROCE, margins, yields and growth take fractions (0.15 is 15 percent). promoter_pct, pledged_pct and deliv_pct take percentages (50 is 50 percent). Multiples such as P/E and debt to equity need no conversion.

Name the dialect

The same text can mean two things. roce > 22 in the dalalos dialect asks for 2,200 percent and matches nothing. Always say which dialect you want in your prompt.

What preset screens are there?

list_preset_screens returned five presets on 29 October 2026. Each is a fixed filter combination computed each night. It is not a live query and it carries no label or ranking. run_preset_screen returns the stored result for one name. A preset that has never been computed returns an empty result with the reason code no_data. We listed the presets and did not run one for this page.

list_preset_screens · 29 Oct 2026
low_price_to_earnings                 Trailing P/E between 0 and 15.
high_dividend_yield_large_market_cap  Trailing-12m dividend yield >= 3% and market cap >= Rs 20,000 Cr.
low_leverage_high_roe                 Debt-to-equity <= 0.5 and return on equity >= 15%.
high_promoter_holding_low_pledge      Promoter holding >= 50% and pledged-promoter-shares <= 5%.
high_growth_latest_results            Latest-quarter revenue YoY growth >= 20%, latest-quarter net income
                                      YoY growth >= 20%, and net margin did not contract YoY.
(all five: computed_at 2026-10-28T16:30:04+00:00, stale: false)

Reformatted from the live response as a table of name and description, no value changed.

How does paging work?

Each screen_by_query response reports a pagination.snapshot_id. Our screen reported 70. Pass it back as snapshot_id with the next offset, and every page reads the same published generation of the nightly metrics. If a refresh publishes a new generation in between, the call fails with snapshot_expired and you restart from offset 0. Sorting puts unknown values last and ends with an ISIN tie-break, so pages never repeat or skip a row.

What are the limits?

  • Nightly data. The snapshot we read was computed on 28 October 2026 at 16:16 UTC, and the preset results at 16:30 UTC. A screen does not reflect later filings or prices.
  • Missing values. A condition on a missing value does not match, so companies without the ratio drop out. 1,923 of 5,293 securities dropped out of our first screen. Use COALESCE(ratio, 0) in a query if you want missing treated as zero.
  • General-only ratios. ROCE, interest coverage, EV ratios, EBITDA margin and the Piotroski score are null for banks, NBFCs and insurers, so they never match a condition on those ratios.
  • No text in a query. A sector or index cannot appear inside the expression. screen_by_query takes it as a separate scope, and screen_stocks takes it as an exact-match filter.
  • A list, not a pick. The tools return every company that meets your criteria in the order you sort. They do not score or recommend.

Is there a web screener?

Yes. The screener on this site runs the same engine. You can browse curated screens, write your own in the screen composer, and read the query guide and the ratio reference. The ratio reference listed 112 ratios on 29 October 2026, 104 of them usable in a screen condition.

How do I ask for it?

EXAMPLE PROMPTS

  • Screen Indian stocks with ROCE of at least 20 percent and debt to equity at most 0.5 using DalalOS. Show 5 rows, the match count and the snapshot date.
  • Use screen_by_query in the screener dialect: ROCE above 22% and either debt to equity below 0.5 or interest coverage above 8. List the first 10 by market cap.
  • List the preset screens DalalOS has and when each was computed.
  • Run the low_leverage_high_roe preset and show the first 10 rows with their as-of date.

To set it up, connect your AI, or follow the guide for Claude, ChatGPT or Cursor and other AI tools. The server is at https://mcp.dalalos.in/mcp. The public repo is DalalOS-Indian-Stock-Research on GitHub.

How we checked

On 29 October 2026 we ran screen_stocks, screen_by_query and list_preset_screens on the live server. We did not run run_preset_screen. Its behaviour, the unit rules for each key and the list of general-only ratios come from the tool descriptions. The ratio count comes from the live ratio reference page on the same date. Figures change as the nightly snapshot refreshes. This is research data, not investment advice, and DalalOS does not rank or rate stocks. Found an error? Email hello@dalalos.in.

FAQ

Common questions

Is there an Indian stock screener I can use through an MCP server?
Yes. DalalOS has four screener tools. screen_stocks takes numeric filters that are AND-combined. screen_by_query takes one free-form expression with OR and arithmetic. list_preset_screens and run_preset_screen return fixed screens computed each night. DalalOS publishes this page, so read the limits section before you rely on it.
Can the screener use OR conditions?
Yes, through screen_by_query. It accepts AND, OR, comparisons, arithmetic and functions such as COALESCE and IF. screen_stocks combines every filter with AND.
What are the two dialects?
screen_by_query takes a dialect. The default, “screener”, reads common screener ratio names in the units a screener page displays, so 22% means 22 percent. The “dalalos” dialect reads DalalOS metric ids in stored units, where 22 percent is 0.22. The server never guesses the dialect.
Does the screener tell me which stocks to buy?
No. A screen returns every company that matches your conditions, sorted by a column you pick, market cap by default. The order is a sort and not a ranking. DalalOS gives no buy or sell calls, target prices or ratings.
How does paging work?
screen_by_query pages from one published snapshot of the nightly metrics. The response gives a snapshot_id. Pass it back as snapshot_id with the next offset. If a refresh lands in between, the call fails with snapshot_expired and you restart from offset 0.
Is there a web screener too?
Yes. The same engine runs the screener on this site. You can browse curated screens, write your own in the screen composer, and read how screens work in the docs. The links are in the sections below.
Is this investment advice?
No. DalalOS returns filed figures and ratios from fixed formulas, filtered by your own criteria. Nothing on this page is investment advice.

Connect your AI to Indian stock market data

Add DalalOS as a connector and sign in once. Free to start with no card and no waitlist; paid plans from ₹199 a month when you need more.

KEEP EXPLORING