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
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dse_mcp-0.1.0.tar.gz.
File metadata
- Download URL: dse_mcp-0.1.0.tar.gz
- Upload date:
- Size: 525.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0c1b4ea6f2f9fdbe9a233c0e752ec7601a2de84c853f82a6562ba8984d38864a
|
|
| MD5 |
27a44d550e62e1a53153300a5cc9ca2b
|
|
| BLAKE2b-256 |
fc96a7e0c256b7de3dbc12c89c1e16735b1ff2bcd0f7f3ce39ee54d0d79dac1a
|
Provenance
The following attestation bundles were made for dse_mcp-0.1.0.tar.gz:
Publisher:
release.yml on ofsazib/dse-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dse_mcp-0.1.0.tar.gz -
Subject digest:
0c1b4ea6f2f9fdbe9a233c0e752ec7601a2de84c853f82a6562ba8984d38864a - Sigstore transparency entry: 2768812567
- Sigstore integration time:
-
Permalink:
ofsazib/dse-mcp@b1f0a6af24023d2113c3d7d1a40d27581949b198 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/ofsazib
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@b1f0a6af24023d2113c3d7d1a40d27581949b198 -
Trigger Event:
push
-
Statement type:
File details
Details for the file dse_mcp-0.1.0-py3-none-any.whl.
File metadata
- Download URL: dse_mcp-0.1.0-py3-none-any.whl
- Upload date:
- Size: 41.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ca26b258ac8633a83c3901bfaf706487a34701447d17d461951c665d314cdc0e
|
|
| MD5 |
f6c6e6eb893780a90a748d8dbed56036
|
|
| BLAKE2b-256 |
7cbfa6d1fa79c4b0110848628f8043ac918c8bed30cbf10170b2d0d61288a616
|
Provenance
The following attestation bundles were made for dse_mcp-0.1.0-py3-none-any.whl:
Publisher:
release.yml on ofsazib/dse-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dse_mcp-0.1.0-py3-none-any.whl -
Subject digest:
ca26b258ac8633a83c3901bfaf706487a34701447d17d461951c665d314cdc0e - Sigstore transparency entry: 2768812708
- Sigstore integration time:
-
Permalink:
ofsazib/dse-mcp@b1f0a6af24023d2113c3d7d1a40d27581949b198 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/ofsazib
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@b1f0a6af24023d2113c3d7d1a40d27581949b198 -
Trigger Event:
push
-
Statement type: