dse-mcp
A production-grade Model Context Protocol (MCP) server for the Dhaka Stock
Exchange (DSE) — live quotes, price history, fundamentals, order-book depth,
news, technical indicators, screening — plus a bundled dse-analysis skill
that teaches your agent a disciplined buy/sell workflow on top of those tools.
Data is scraped from dsebd.org (DSE's official site) with
all of its production quirks handled: incomplete TLS chains, -- placeholders,
comma-grouped numbers, invisible layout tables, market-hours-aware caching, and a
mirror-domain fallback. Informational only — not investment advice. Not
affiliated with DSE.
Install
Requires Python 3.12+ (or just uv/pipx, which manage Python for you).
# Register with Claude Code (recommended)
claude mcp add dse -s user -- uvx dse-mcp
Other clients
Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"dse": { "command": "uvx", "args": ["dse-mcp"] }
}
}
Cursor (~/.cursor/mcp.json): same JSON shape as Claude Desktop.
pipx:
pipx install dse-mcp
# then register with the command "dse-mcp"
Docker:
docker run -i --rm ghcr.io/ofsazib/dse-mcp
The dse-analysis skill
The repo ships an agent skill that turns these tools into a repeatable buy/sell analysis workflow (market context → fundamentals → technicals → news → verdict with confidence + risks):
# from a git clone of this repo
./scripts/install_skill.sh # installs to ~/.claude, ~/.agents, ~/.zcode
Or copy skills/dse-analysis/ into your client's skills directory manually.
Tools (16)
Every response carries market_status (live/closed), data_freshness
(live/snapshot/stale), and data_as_of — so closed-market data is never mistaken
for live prices.
Market
| Tool | Description |
|---|---|
market_status |
Live/closed, session hours, Dhaka time, next session |
market_summary |
DSEX/DS30/DSES + changes, totals for the latest session |
get_index_history(days) |
Daily index history (rolling one-year archive) |
top_movers(category) |
gainers | losers | most_active | turnover |
sector_performance |
Advancing/declining + avg change per sector |
Stock
| Tool | Description |
|---|---|
search_symbols(query) |
Fuzzy search over 636 bundled instruments (22 sectors) |
get_quote(symbol) |
LTP, day range, close, change, trades, value, volume |
get_price_history(symbol, start, end, days) |
Day-end OHLCV, oldest-first |
get_company_profile(symbol) |
Capital structure, listing year, 52w range, EPS block |
get_fundamentals(symbol) |
Analysis-ready: EPS, P/E, dividends, reserves, 52w |
get_market_depth(symbol) |
Live bid/ask levels + session stats |
get_news(symbol, days, limit) |
Company or market-wide news/disclosures |
get_pe_ratios() |
P/E table (interim/audited/trailing) for all instruments |
Analysis & screening
| Tool | Description |
|---|---|
compute_indicators(symbol, ...) |
SMA50/200, RSI(14), MACD, Bollinger |
technical_summary(symbol) |
Trend, support/resistance, outlook + reasons |
screen_stocks(sector, pe_max, price_range, volume_min) |
Filter the live board |
Trading-hours aware caching
- Market live (Sun–Thu 10:00–14:50 Asia/Dhaka): data cached 30s (depth is always fetched fresh).
- Market closed: the last session's snapshot is cached ~1h and persisted to
~/.cache/dse-mcp/, so a restart still serves the last session (labeledsnapshot). - DSE unreachable: the persisted snapshot is served labeled
stale.
Configuration (optional)
All via environment variables with the DSE_MCP_ prefix — see
.env.example. Useful ones:
| Variable | Default | Purpose |
|---|---|---|
DSE_MCP_RATE_LIMIT |
5.0 |
Outbound requests/second (token bucket) |
DSE_MCP_CACHE_TTL_OPEN |
30 |
Seconds, while the market is live |
DSE_MCP_CACHE_DIR |
~/.cache/dse-mcp |
Snapshot persistence |
DSE_MCP_LOG_LEVEL |
WARNING |
Logs go to stderr (never stdout — MCP) |
Troubleshooting
[SSL: CERTIFICATE_VERIFY_FAILED]— dsebd.org serves an incomplete TLS chain. dse-mcp uses the OS trust store (truststore), which handles it; do not replace it withverify=False.- Empty depth / quotes look frozen — the market is closed (or a holiday).
Check
market_statusand the response'sdata_as_of. DGEN: null— the DGEN index is retired from DSE's live pages; null is the honest value.
Development
git clone https://github.com/ofsazib/dse-mcp && cd dse-mcp
uv sync # Python 3.12 via uv
uv run pytest # 44 offline tests (recorded fixtures)
uv run ruff check .
uv run dse-mcp # run the server locally
npx @modelcontextprotocol/inspector uv run dse-mcp # visual debugging
Re-record fixtures when dsebd.org markup changes: uv run python scripts/record_fixtures.py.
Rebuild the instrument bundle: uv run python scripts/build_instruments.py.
See AGENTS.md for architecture and CONTRIBUTING.md
to contribute.
Legal
- Data source: dsebd.org (Dhaka Stock Exchange). This project is an independent, unaffiliated open-source client; data remains the property of DSE.
- Nothing here is investment advice. DSE securities can be illiquid and subject to circuit breakers; verify everything against primary sources before acting.
License
MIT © Omar Faruk Sazib
Metadata
Release files for dse-mcp 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| dse_mcp-0.1.0.tar.gz | 525.3 kB | With provenance | Details for dse_mcp-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| dse_mcp-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for dse_mcp-0.1.0-py3-none-any.whl |
Total release size: 566.5 kB
Release files / dse_mcp-0.1.0.tar.gz
| Download URL | dse_mcp-0.1.0.tar.gz |
|---|---|
| Size | 525.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0c1b4ea6f2f9fdbe9a233c0e752ec7601a2de84c853f82a6562ba8984d38864a
|
|
BLAKE2b-256 checksum How to use checksums |
fc96a7e0c256b7de3dbc12c89c1e16735b1ff2bcd0f7f3ce39ee54d0d79dac1a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 9, 2026.
Transparency logRelease files / dse_mcp-0.1.0-py3-none-any.whl
| Download URL | dse_mcp-0.1.0-py3-none-any.whl |
|---|---|
| Size | 41.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ca26b258ac8633a83c3901bfaf706487a34701447d17d461951c665d314cdc0e
|
|
BLAKE2b-256 checksum How to use checksums |
7cbfa6d1fa79c4b0110848628f8043ac918c8bed30cbf10170b2d0d61288a616
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 9, 2026.
Transparency logSecurity for dse-mcp 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for dse_mcp-0.1.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 9, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.