Odel
Daepak Market Intelligence

Daepak Market Intelligence

@mobiss11PythonMITUpdated 2 days ago

Market analyst tools + AI agent: crypto, US equities, options, Korea, fundamentals, macro, backtests

Server endpointStreamable HTTPOAuthProbed

This is the third-party server itself — Odel doesn't run it. Hitting this URL directly talks straight to the upstream server with no auth or proxying. Connect through Odel to front it with managed auth.

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.

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:

[mcp_servers.daepak]
url = "https://daepak.com/mcp"

Prefer a key instead of OAuth (servers, CI)? Send it as a header:

claude mcp add --transport http daepak https://daepak.com/mcp --header "Authorization: Bearer dpk_live_…"

Local (stdio)

claude mcp add daepak -e DAEPAK_API_KEY=dpk_live_… -- uvx daepak-mcp

Or install it yourself:

pip install daepak-mcp

Get a key on the Keys page of your profile at daepak.com. The free plan includes 2 000 credits a month — enough to build something over an evening.

Configuration

variabledefaultpurpose
DAEPAK_API_KEYyour key, dpk_live_…. Required.
DAEPAK_BASE_URLhttps://daepak.compoint at another environment
DAEPAK_TIMEOUT120seconds 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.

scopetoolswhat it opens
read:market88prices, candles, indicators, levels, scores, narratives, derivatives, order book, liquidations, options, US equities, Korean market, fundamentals (OpenDART, SEC), macro (FRED), backtests
read:personal9your positions, portfolio, trade journal, catalysts, memory, background tasks
write:personal11writing to those same records
agent:chatfull analyst answers, streamed or complete

Being allowed to read your journal does not allow writing to it. That is a separate scope.

Cryptoget_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

Koreaget_kimchi_premium (the Upbit-to-global spread, decomposed into the asset leg and the currency leg), Korean tickers, fresh Upbit listings

US equitiesget_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 sourcesget_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)

Macroget_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.

Optionsget_iv_metrics, get_options_positioning, get_option_structure (payoff and greeks), get_options_backtest

Validationget_backtest, get_signal_outcomes, get_hit_rate, get_score_history

Arbitrary tokensresolve_token, get_token_market, get_token_onchain, get_token_holders, for anything outside the watchlist

Researchsearch_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/streamserver-sent events — text arrives as it is written
POST /v1/agent/messagesthe 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/conversationsyour conversations, and /{id} for the messages
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:

tierwhatcredits
our databaseprices, indicators, levels, candles, narratives1
external callequities, tokens, options, on-chain5
embedding, sandboxnews search, code execution20

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.

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.

# 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"}'
{
  "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 · OpenAPI 3.1: /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

License

MIT