Daepak Market Intelligence
Market analyst tools + AI agent: crypto, US equities, options, Korea, fundamentals, macro, backtests
Open source Repository Open in the app JSON README (API)
About
Market analyst tools + AI agent: crypto, US equities, options, Korea, fundamentals, macro, backtests
Details
- Kind
- MCP servers
- Topic
- Finance & crypto
- Publisher
- mobiss11
- Origin
- official
- Category
- ferramentas
- Transport
- http
- Version
- 2.1.1
- Last push
- 2026-09-04T14:49:56Z
- Repository state
- ativo
- Language
- Python
- License
- MIT
- Added
- 2026-09-01 06:00:07
- Updated
- 2026-09-04 14:00:37
- Origin id
io.github.Mobiss11/daepak-mcp
README
# Daepak MCP
<!-- mcp-name: io.github.Mobiss11/daepak-mcp -->
Market intelligence tools for any MCP-capable engine — Claude Code, Claude Desktop, or your
own agent. Prices, indicators, levels, positioning, the Korean market, US equities, options,
backtests, macro (FRED), SEC and OpenDART fundamentals, and your own trading journal. **108 tools**, the same ones the product's own
analyst uses.
The server describes nothing itself: it pulls the catalogue from `GET /v1/tools`, so it
shows exactly what your key is allowed to call and never drifts from the product.
## Quick start
### No install — remote server (recommended)
The same tools are served at `https://daepak.com/mcp` (Streamable HTTP) with OAuth 2.1:
you sign in once in the browser, no key to copy.
```bash
claude mcp add --transport http daepak https://daepak.com/mcp
```
Then `/mcp` inside Claude Code → **daepak** → Authenticate. Works the same way as a custom
connector in Claude.ai (paste the URL) and in ChatGPT developer mode. For Codex CLI:
```toml
[mcp_servers.daepak]
url = "https://daepak.com/mcp"
```
Prefer a key instead of OAuth (servers, CI)? Send it as a header:
```bash
claude mcp add --transport http daepak https://daepak.com/mcp --header "Authorization: Bearer dpk_live_…"
```
### Local (stdio)
```bash
claude mcp add daepak -e DAEPAK_API_KEY=dpk_live_… -- uvx daepak-mcp
```
Or install it yourself:
```bash
pip install daepak-mcp
```
Get a key on the **Keys** page of your profile at [daepak.com](https://daepak.com). The free
plan includes 2 000 credits a month — enough to build something over an evening.
## Configuration
| variable | default | purpose |
|---|---|---|
| `DAEPAK_API_KEY` | — | your key, `dpk_live_…`. Required. |
| `DAEPAK_BASE_URL` | `https://daepak.com` | point at another environment |
| `DAEPAK_TIMEOUT` | `120` | seconds per call |
Nothing else is read. In particular there is **no** setting that names a user: the account
is derived from the key, and a request cannot claim to be someone else.
## What you get
The catalogue is filtered by your key's scopes — you never see a tool you cannot call.
| scope | tools | what it opens |
|---|---|---|
| `read:market` | 88 | prices, candles, indicators, levels, scores, narratives, derivatives, order book, liquidations, options, US equities, Korean market, fundamentals (OpenDART, SEC), macro (FRED), backtests |
| `read:personal` | 9 | your positions, portfolio, trade journal, catalysts, memory, background tasks |
| `write:personal` | 11 | writing to those same records |
| `agent:chat` | — | full analyst answers, streamed or complete |
Being allowed to read your journal does not allow writing to it. That is a separate scope.
**Crypto** — `get_price`, `get_price_history`, `get_levels` (support/resistance, Fibonacci,
ATR — computed, not drawn), `get_indicators`, `get_score`, `get_regime`, `get_derivatives`,
`get_orderbook`, `get_liquidations`, `get_fear_greed`
**Korea** — `get_kimchi_premium` (the Upbit-to-global spread, decomposed into the asset leg
and the currency leg), Korean tickers, fresh Upbit listings
**US equities** — `get_stock_quote`, `get_stock_history`, `get_stock_levels`,
`get_stock_holders` (institutions and insiders), `get_us_gap_stats`, `get_us_movers`,
`get_us_halts`, `get_us_insiders`
**Fundamentals from primary sources** — `get_kr_financials` (K-IFRS for any KRX listing,
OpenDART), `get_us_financials` (US-GAAP and IFRS by fiscal year from SEC EDGAR, up to 20
years), `compare_financials` (Korean and US companies in one schema, USD at the FRED rate),
`get_kr_insiders`, `screen_kr` (the whole KRX with RS percentiles and foreign-ownership
flow), `get_kr_rs`, `list_kr_etfs`, `backtest_kr_portfolio` (against KOSPI)
**Macro** — `get_macro_snapshot` (Fed funds, US 2Y/10Y and the curve, broad dollar,
USD/KRW, VIX, CPI as YoY, unemployment, Korean overnight rate), `get_macro_series` (any
FRED id with history). Every row carries `stale_days`; Korean CPI is absent on purpose —
FRED's series died in 2023.
**Options** — `get_iv_metrics`, `get_options_positioning`, `get_option_structure` (payoff and
greeks), `get_options_backtest`
**Validation** — `get_backtest`, `get_signal_outcomes`, `get_hit_rate`, `get_score_history`
**Arbitrary tokens** — `resolve_token`, `get_token_market`, `get_token_onchain`,
`get_token_holders`, for anything outside the watchlist
**Research** — `search_news` (RAG over the collected corpus), `search_narratives`,
`fetch_url`, `web_search`
## The agent
The same analyst that answers in the product, over HTTP. It has everything the chat has:
| | |
|---|---|
| `POST /v1/agent/stream` | server-sent events — text arrives as it is written |
| `POST /v1/agent/messages` | the complete answer in one response |
| `GET /v1/agent/resume/{id}` | reconnect to a generation already running |
| `POST /v1/agent/cancel/{id}` | stop one |
| `GET /v1/agent/conversations` | your conversations, and `/{id}` for the messages |
```bash
curl -N -X POST https://daepak.com/v1/agent/stream \
-H "Authorization: Bearer dpk_live_…" -H "Content-Type: application/json" \
-d '{"message": "How does BTC look right now?", "mode": "mentor"}'
```
**Conversation memory.** The first event carries `conversation_id`; pass it back and the
context continues.
**Images.** `images` takes data-URLs, exactly like chat attachments — the agent reads charts
and screenshots.
**Mentor mode.** `mode: "mentor"` explains how the reading was arrived at, not just the
conclusion.
⚠️ **A dropped connection loses nothing.** Generation continues in the background, the answer
still lands in the conversation, and `resume` replays what you missed. Keep the
`conversation_id` from the first event — that is where you reconnect.
⚠️ `suggest` (follow-up questions) arrives **after** `done`. A client that stops reading at
`done` will never see it. The order is deliberate: the spinner should stop before the
suggestions are computed.
## Credits
Every tool declares its price in the catalogue, so a sequence can be budgeted before it runs.
Prices come from measuring the tools in production, not from guessing:
| tier | what | credits |
|---|---|---|
| our database | prices, indicators, levels, candles, narratives | 1 |
| external call | equities, tokens, options, on-chain | 5 |
| embedding, sandbox | news search, code execution | 20 |
A tool nobody has priced yet costs 5, not 1 — an unpriced tool is either an oversight or
something heavy, and both are safer to over-charge than to give away.
```bash
curl -H "Authorization: Bearer dpk_live_…" https://daepak.com/v1/usage
```
When the monthly credits run out you get `402` naming two ways forward: a higher plan or the
renewal at the start of the month. **There is no overage billing** — we would rather refuse
than send an invoice nobody expected.
## Using the API directly
The MCP server is a thin shell over a plain REST API.
```bash
# catalogue: schema, scope and price for every tool your key can call
curl -H "Authorization: Bearer dpk_live_…" https://daepak.com/v1/tools
# call one
curl -X POST https://daepak.com/v1/tools/get_price \
-H "Authorization: Bearer dpk_live_…" \
-H "Content-Type: application/json" \
-d '{"coin": "BTC"}'
```
```json
{
"tool": "get_price",
"credits_used": 1,
"credits_left": 1999,
"took_ms": 104,
"data": { "coin": "BTC", "price": 78017.26, "change_24h": -1.2 }
}
```
Full reference: [daepak.com/reference](https://daepak.com/reference) ·
OpenAPI 3.1: [/v1/openapi.json](https://daepak.com/v1/openapi.json) (106 operations, no key
needed to read it).
## Reading the answers honestly
A few things the data will tell you if you look, and which are easy to get wrong:
- **Compare against the baseline, not against zero.** "68 % of directions guessed" means
nothing until you know what a random entry at the same moment would have given.
- **Win rate is not money.** On our own data 68 % correct directions produced a
profit factor of 1.04.
- **Groups under 30 observations are flagged `reliable=false`.** That is an absence of a
conclusion, not a weak one.
- **The kimchi premium has two legs** — a discount on the asset and a discount on the won.
Read together they mislead. And they explain rather than predict: on horizons up to a day
we found no relationship (646 episodes).
- Every answer carries the age of its data. If it is stale, say so rather than passing
yesterday off as now.
## Troubleshooting
**`401`** — the key is missing, revoked, or malformed. Send it as
`Authorization: Bearer dpk_live_…`.
**`403 scope_required`** — the key lacks the scope; the response names which one.
**`400 user_id_not_accepted`** — the body contained a `user_id`. The account comes from the
key; the field is rejected explicitly rather than ignored, so that a copied example fails
loudly instead of quietly returning nothing.
**`404 conversation_not_found`** — that conversation belongs to another account.
**`429`** — over the per-minute ceiling for your plan. The minute limit protects the service;
the monthly one protects your budget.
**`CERTIFICATE_VERIFY_FAILED`** — you are running from source without `certifi`. Install the
package instead of the file; the dependency exists for exactly this.
Error messages default to English; send `X-Lang: ko` or `ru` for those languages.
## Links
- [daepak.com](https://daepak.com) — the product
- [Developer docs](https://daepak.com/developers) — with a live request tester
- [GitHub](https://github.com/Mobiss11/daepak-mcp) · [PyPI](https://pypi.org/project/daepak-mcp/)
## License
MIT