Indian NSE Stock Insights

io.github.alokbarnwalPublished by GitHub account alokbarnwalv1.0.1Updated Oct 24, 2026

Analyze any Nifty 500 stock with AI — price action, demand zones, technicals & screener.

VerifiedStreamable HTTPWeb executableFinanceData & Analytics

Overview

AI-generated overview

Remote MCP server for Indian NSE stock analysis: quotes, OHLCV, technical indicators, price-action levels and a Nifty 500 screener.

What you can do
  • Fetch price snapshots and OHLCV candles for NSE symbols across daily, 15-minute and 5-minute timeframes
  • Read technical indicators such as EMA, SMA, RSI, MACD, Bollinger Bands, ADX, ATR, OBV and VWAP
  • Inspect price-action levels: pivot and support/resistance levels, demand and supply zones, Fibonacci retracements
  • Detect single-bar candlestick patterns and multi-bar chart patterns, and review volume hotspots and OBV trend
  • Compare two to five symbols side by side and screen the active universe by RSI, ADX, trend, pattern, volume ratio or sector
  • Get a market-wide overview of indices, top gainers and losers, most active names and breadth
When to use it
Useful when you want an assistant to answer questions about Indian equities — technical setups, support and resistance, screening Nifty 500 names, or comparing a few stocks — without building your own data pipeline.
Requirements
A remote MCP endpoint; no account, API key or local runtime is declared. Connect an MCP client to the hosted server URL. Data is sourced from Yahoo Finance and refreshed on a schedule during NSE market hours (09:15–15:30 IST, weekdays).
Before you install
The project states it is educational only and not investment advice; treat outputs as informational. The hosted endpoint applies rate limits per IP and bans repeat offenders, so heavy automated use may be throttled. Data comes from a third-party source and may lag or be incomplete. Self-hosting requires a MySQL database and credentials of your own.

Installation

In SourceWeft

  1. Open Indian NSE Stock Insights in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.alokbarnwal%2Fnse-public-mcp/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "indian-nse-stock-insights": {
      "type": "http",
      "url": "https://stockmcp.alokbarnwal.com/mcp"
    }
  }
}

README

Indian NSE Stock Insights 🇮🇳📈

Public MCP server for Indian stock market analysis — Nifty 500 universe, 12 tools, 3 timeframes.

Built with FastMCP · Data from yfinance · Hosted at stockmcp.alokbarnwal.com

Educational only. Not investment advice. See DISCLAIMER.md.


Quick Connect — 30 Seconds

Claude.ai → Settings → Connectors → Add custom MCP connector:

Name: Indian NSE Stock InsightsURL:  https://stockmcp.alokbarnwal.com/mcp

That's it. Start asking questions about Indian stocks.


12 Tools

#ToolParametersWhat it returns
1get_stock_quotesymbolLast close, prev close, change %, day H/L, volume
2get_ohlc_datasymbol, timeframe?, limit?OHLCV candles (up to 500, newest first)
3get_technical_indicatorssymbol, timeframe?EMAs, SMAs, RSI, MACD, Bollinger, ADX, Stoch, ATR, OBV, VWAP
4get_support_resistancesymbol, timeframe?Pivot points + historical S/R levels
5get_demand_supply_zonessymbol, timeframe?, status?Demand/supply zones (DBR/RBR/RBD/DBD)
6get_candlestick_patternssymbol, timeframe?, limit?HAMMER, DOJI, ENGULFING, etc.
7get_chart_patternssymbol, timeframe?, status?DOUBLE_TOP, HEAD_AND_SHOULDERS, etc.
8get_fibonacci_levelssymbol, timeframe?Retracement swings (UP/DOWN) with fib levels
9get_volume_analysissymbol5min hotspots, OBV trend, volume ratio
10get_market_overview(none)Indices, top gainers/losers, most active, breadth
11compare_stockssymbols (2-5) , timeframe?Side-by-side: quote, RSI/MACD/ADX, trend, 30d return
12screen_stocksfiltersFilter by RSI, ADX, trend, pattern, sector, etc.

timeframe defaults to daily. Options: daily, 15min, 5min.


Example Prompts

Try these in Claude.ai after connecting:

  • "RELIANCE ka technical analysis do — RSI, MACD, aur support/resistance levels batao"
  • "Show me Nifty 500 stocks with RSI below 30 and ADX above 25"
  • "Compare TCS, INFY, and WIPRO — which one has the best setup right now?"
  • "What does the overall market look like today? Show me top gainers and losers"
  • "HDFC Bank ke demand and supply zones dikhao on the 15-minute chart"

Architecture

mermaid
graph TB    subgraph Internet        C[Claude.ai / MCP Client]    end
    subgraph Server["Production Server"]        subgraph Protection            F2B[fail2ban<br/>auto-ban repeat abusers]            NG[nginx<br/>rate limit 20r/s · conn limit · TLS]        end
        subgraph Application            MCP["FastMCP Server<br/>port 8089 · 12 tools"]            TOOLS["Tool Modules<br/>quote · ohlc · indicators<br/>levels · zones · patterns<br/>fibonacci · volume · market<br/>compare · screener"]        end
        subgraph Data            DB[(MySQL: nse_public<br/>500 stocks × 3 timeframes)]            CRON[Cron Jobs<br/>5min · 15min · daily]        end    end
    subgraph External        YF[Yahoo Finance<br/>yfinance API]    end
    C -->|HTTPS POST /mcp| NG    NG -->|proxy_pass| MCP    MCP --> TOOLS    TOOLS -->|read-only queries| DB    YF -->|OHLCV data| CRON    CRON -->|upsert| DB    F2B -.->|monitors| NG

Data Coverage

TimeframeRetentionUpdate FrequencyStocks
Daily5 yearsEOD (18:00 IST)500
15-minute2 yearsEvery 15 min (market hours)500
5-minute6 monthsEvery 5 min (market hours)500

Market hours: 09:15–15:30 IST, Monday–Friday (excluding NSE holidays).


Rate Limits

LayerLimitAction
nginx20 requests/sec per IP (burst 40)HTTP 429
nginx10 simultaneous connections per IPHTTP 429
fail2ban5× rate-limit violations in 2 minIP banned for 1 hour

Self-Hosting

Click to expand — full deployment runbook

Runs on /home/ubuntu/nse-public-mcp/ — completely isolated from /home/ubuntu/swingtrader/.

1. Clone

bash
cd /home/ubuntugit clone https://github.com/alokbarnwal/nse-public-mcp.gitcd nse-public-mcp

2. Create database and user

bash
sudo mysql <<'SQL'CREATE DATABASE IF NOT EXISTS nse_public CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;CREATE USER IF NOT EXISTS 'nse_writer'@'localhost' IDENTIFIED BY 'CHANGE_ME_STRONG_PASSWORD';GRANT ALL PRIVILEGES ON nse_public.* TO 'nse_writer'@'localhost';FLUSH PRIVILEGES;SQL

3. Apply schema

bash
mysql -u nse_writer -p nse_public < db/schema.sqlmysql -u nse_writer -p nse_public < db/schema_indicators.sqlmysql -u nse_writer -p nse_public < db/schema_price_action.sql

4. Install dependencies

bash
python3 -m venv .venvsource .venv/bin/activatepip install -r requirements.txt

5. Configure environment

bash
cp .env.example .envchmod 600 .envnano .env                 # set DB_PASSWORD to match step 2

6. (Optional) Refresh full Nifty 500 list

The repo ships with the top ~100 stocks hardcoded. To expand to all 500:

bash
python -m config.stocks --refresh        # fetches NSE archives, rewrites config/stocks.py

7. Load stock universe into DB

bash
python -m config.stocks --load-to-db

8. Backfill historical data (long-running, use screen/tmux)

bash
screen -S backfillsource .venv/bin/activatepython -m data.backfill --all# Ctrl-A D to detach. Reattach: screen -r backfill

Expected runtime:

  • daily 5y × 500: ~30 min
  • 15min 2y × 500: ~2 h
  • 5min 6mo × 500: ~1 h

If anything fails, the failure list is written to backfill_failures_<timeframe>.json. Re-run:

bash
python -m data.backfill --timeframe 15min --resume

8b. Bulk-compute indicators (long-running, use screen/tmux)

After the candle backfill completes, populate the indicators table for all 500 stocks across all 3 timeframes:

bash
screen -S indicatorscd /home/ubuntu/nse-public-mcppython3 -m indicators.runner --all# Ctrl-A D to detach

Expected runtime: ~30–45 min. Idempotent — safe to re-run if interrupted.

8c. Bulk-compute price action (long-running, use screen/tmux)

After indicators are populated, compute price-action features (zones, S/R, patterns, breakouts, fibs, gaps, volume profile) for all 500 stocks across all 3 timeframes:

bash
screen -S price_actioncd /home/ubuntu/nse-public-mcppython3 -m price_action.runner --timeframe daily --all-featurespython3 -m price_action.runner --timeframe 15min --all-featurespython3 -m price_action.runner --timeframe 5min  --all-features# Ctrl-A D to detach

Expected runtime: ~60–90 min total. Idempotent — safe to re-run if interrupted.

9. Install crontab

bash
crontab -e

Add:

cron
# nse-public-mcp candle updaters*/5  9-15 * * 1-5 cd /home/ubuntu/nse-public-mcp && /home/ubuntu/nse-public-mcp/.venv/bin/python -m jobs.cron_5min  >> logs/cron_5min.log 2>&1*/15 9-15 * * 1-5 cd /home/ubuntu/nse-public-mcp && /home/ubuntu/nse-public-mcp/.venv/bin/python -m jobs.cron_15min >> logs/cron_15min.log 2>&10    18   * * 1-5 cd /home/ubuntu/nse-public-mcp && /home/ubuntu/nse-public-mcp/.venv/bin/python -m jobs.cron_daily >> logs/cron_daily.log 2>&1
# nse-public-mcp indicator updaters (each runs after the matching candle fetch)30       18   * * 1-5 cd /home/ubuntu/nse-public-mcp && /usr/bin/python3 -m jobs.cron_indicators_daily >> logs/indicators_daily.log 2>&120,35,50 9-15 * * 1-5 cd /home/ubuntu/nse-public-mcp && /usr/bin/python3 -m jobs.cron_indicators_15min >> logs/indicators_15min.log 2>&15        16   * * 1-5 cd /home/ubuntu/nse-public-mcp && /usr/bin/python3 -m jobs.cron_indicators_15min >> logs/indicators_15min.log 2>&12-57/5   9-15 * * 1-5 cd /home/ubuntu/nse-public-mcp && /usr/bin/python3 -m jobs.cron_indicators_5min  >> logs/indicators_5min.log 2>&1
# nse-public-mcp price-action updaters (each runs after the matching indicator cron)35       18   * * 1-5 cd /home/ubuntu/nse-public-mcp && /usr/bin/python3 -m jobs.cron_price_action_daily  >> logs/price_action_daily.log 2>&125,55    9-15 * * 1-5 cd /home/ubuntu/nse-public-mcp && /usr/bin/python3 -m jobs.cron_price_action_15min >> logs/price_action_15min.log 2>&19-54/15  9-15 * * 1-5 cd /home/ubuntu/nse-public-mcp && /usr/bin/python3 -m jobs.cron_price_action_5min  >> logs/price_action_5min.log 2>&1

Cron times are server-local. Verify the server is on IST (timedatectl) — if not, shift the hour ranges. The 5-min indicator cron is offset to 2-57/5 so it runs ~2 minutes after cron_5min and never reads stale candles. The price-action 5-min cron is offset to 9-54/15 (minutes 9, 24, 39, 54) so it runs ~2 minutes after each cron_indicators_5min slot.

10. Verification

bash
mysql -u nse_writer -p nse_public <<'SQL'SELECT 'daily' AS tf, COUNT(*) AS n FROM candles_dailyUNION ALL SELECT '15min', COUNT(*) FROM candles_15minUNION ALL SELECT '5min',  COUNT(*) FROM candles_5min;
-- Per-stock coverage on daily — flag any with < 1000 rows (~4 trading years)SELECT symbol, COUNT(*) AS nFROM candles_dailyGROUP BY symbolHAVING n < 1000ORDER BY n;
-- Latest data freshnessSELECT MIN(candle_date) AS earliest, MAX(candle_date) AS latestFROM candles_daily;
-- Recent cron healthSELECT job_type, timeframe, symbols_success, symbols_failed, started_at, duration_secondsFROM fetch_logORDER BY started_at DESCLIMIT 20;SQL

DB size on disk:

bash
sudo du -sh /var/lib/mysql/nse_public/

Service Management

bash
# Server statussudo systemctl status nse-public-mcp
# Restartsudo systemctl restart nse-public-mcp
# Logssudo journalctl -u nse-public-mcp -n 100 -f
# nginxsudo nginx -t && sudo systemctl reload nginx
# fail2bansudo fail2ban-client status nginx-mcp-ratelimit

Layout

See PROJECT.md for architecture and data-flow diagram.

config/        # settings, stock universe, holiday calendardata/          # yfinance fetcher, backfill CLI, shared upsert helpersdb/            # schema and pooled connectionindicators/    # technical indicator compute, persist, runnerprice_action/  # zones, patterns, levels, trendsmcp_server/    # FastMCP server + 12 tool modulesjobs/          # cron entrypoints (candles + indicators + price action)deploy/        # systemd service, nginx config, fail2ban rulestests/         # mocked unit tests (82 tests)

Operational Notes

  • Be respectful to Yahoo Finance. The fetcher sleeps 1–3 s between requests and retries with backoff. Don't reduce these.
  • Idempotent. All inserts are INSERT … ON DUPLICATE KEY UPDATE. Replaying a cron tick or rerunning backfill is safe.
  • Holiday calendar lives in config/holidays.py. Update it once a year when NSE publishes the next year's list.
  • Retention cleanup runs at the end of jobs/cron_daily.py. Daily candles older than 5 y, 15min older than 2 y, 5min older than 6 mo are purged.

License

MIT — free to use, modify, and distribute.

Disclaimer

This project is for educational and informational purposes only. Not investment advice. See DISCLAIMER.md.

Source: README.md at commit aaefc5c

Tools

12

get_stock_quote

Latest price snapshot for an NSE stock — last close, prev close, change %, day H/L, volume.

Parameterssymbolrequired

get_ohlc_data

Recent OHLCV candles. timeframe in {daily, 15min, 5min}; limit capped at 500; newest first.

Parameterslimitsymbolrequiredtimeframe

get_technical_indicators

Latest technical indicators (EMAs, SMAs, RSI, MACD, BB, ADX, Stoch, ATR, OBV, VWAP).

Parameterssymbolrequiredtimeframe

get_support_resistance

Pivot points + historical support/resistance levels, ordered by price desc.

Parameterssymbolrequiredtimeframe

get_demand_supply_zones

Demand/supply zones (DBR/RBR/RBD/DBD) split into demand_zones and supply_zones.

Parametersstatussymbolrequiredtimeframe

get_candlestick_patterns

Recent single-bar candlestick patterns (HAMMER, DOJI, ENGULFING, ...) newest first.

Parameterslimitsymbolrequiredtimeframe

get_chart_patterns

Multi-bar chart patterns (DOUBLE_TOP, HEAD_AND_SHOULDERS, ...). 'ACTIVE' = PENDING/CONFIRMED.

Parametersstatussymbolrequiredtimeframe

get_fibonacci_levels

Latest fibonacci retracement swings (UP/DOWN) with 236/382/500/618/786 levels.

Parameterssymbolrequiredtimeframe

get_volume_analysis

Volume diagnostic: top 5min hotspots + peak slot + OBV 20-day trend + today/20-day volume ratio.

Parameterssymbolrequired

get_market_overview

Market-wide snapshot: indices, top_gainers, top_losers, most_active, breadth.

Takes no parameters.

compare_stocks

Side-by-side comparison of 2-5 symbols: quote, RSI/MACD/ADX, trend, 30d return, latest pattern.

Parameterssymbolsrequiredtimeframe

screen_stocks

Filter the active universe. Keys: rsi_min, rsi_max, adx_min, trend, near_demand_zone, pattern, min_volume_ratio, sector. At least one required.

Parametersfiltersrequired

Version history

1
  1. v1.0.1LatestSep 16, 2026

Score

100% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts