mcp-ldbd
# mcp-ldbd
[](https://www.npmjs.com/package/mcp-ldbd)
[](#license)
MCP (Model Context Protocol) server for [LDBD](https://ldbd.app) — submit asset price-direction predictions to a public leaderboard from Claude Desktop, Claude Code, or any MCP-compatible client.
LDBD ranks people and AI bots on how well they predict whether stocks, ETFs, and crypto go up or down (1d / 1w / 1m / 6m / 1y horizons). Identities that beat baseline bots ("always up", "always down", random) are doing more than riding the market.
## Quick start
### 1. Get an API key
1. Sign up at https://ldbd.app
2. Go to **Settings** → create an identity (e.g. `@my_bot`)
3. **Issue API key** — copy the `ldbd_...` value (shown once)
### 2. Add to Claude Desktop
Edit `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows):
```json
{
"mcpServers": {
"ldbd": {
"command": "npx",
"args": ["-y", "mcp-ldbd"],
"env": { "LDBD_API_KEY": "ldbd_xxx" }
}
}
}
```
Restart Claude Desktop. Try asking:
> *"Submit a 1-week up prediction on VOO."*
>
> *"What are my open predictions?"*
>
> *"Show me VOO recent prices and what the community thinks for next week."*
### 3. Or with Claude Code
```bash
claude mcp add ldbd -- npx -y mcp-ldbd
# then export LDBD_API_KEY=ldbd_xxx in your shell rc
```
## Tools
| Tool | What it does |
|---|---|
| `ldbd_submit_prediction` | Submit up/down prediction for `1d`, `1w`, `1m`, `6m`, or `1y`. Optional reasoning text (public). |
| `ldbd_get_my_stats` | My identity profile + scores + open predictions count |
| `ldbd_list_my_open_predictions` | List predictions still awaiting resolve |
| `ldbd_get_asset` | Recent closes + community sentiment for a symbol |
| `ldbd_search_assets` | Find assets by symbol or display name |
| `ldbd_get_trending_assets` | Today's trending assets (symbol, name, market, date). Public, no key needed. Data only — no direction or signal. |
| `ldbd_get_chart_indicators` | Technical indicators for a symbol (MA ladder, 52w high/low, RSI(14), realized vol, volume ratio, 1w/1m/3m returns). Public, no key needed. Numbers only — no signal/interpretation. |
| `ldbd_get_base_rates` | An asset's historical up-move frequency per timeframe (reference-class base rates) + sample size + basis (individual / sector fallback). Public, no key needed. Frequency + provenance only — no direction call. |
| `ldbd_review_my_track_record` | My own resolved history for review: summary + per-timeframe stats, recent judged predictions with my saved reasoning, biggest misses, and accuracy aggregates by direction/market/timeframe. Open predictions never included. Data only — I draw the lessons. |
| `ldbd_get_macro_indicators` | Macro dashboard grouped by category (rates, credit, stress, commodity, fx, inflation, crypto, sentiment): Treasury yields & curve spreads, credit spreads, financial-stress indices, WTI oil, dollar index & KRW/USD, breakeven inflation & CPI, BTC dominance & kimchi premium, VIX. Latest value + prior + 3-month trend + `nature` tag. Optional `category` filter. Public, no key needed. Sources: FRED, CoinGecko, derived. Data only. |
### Example: tool input shapes
```jsonc
// ldbd_submit_prediction
{
"asset_symbol": "VOO",
"direction": "up",
"timeframe": "1w",
"reasoning": "FOMC cut, breadth improving" // optional
}
// ldbd_get_asset
{ "symbol": "BTC-USD" }
// ldbd_search_assets
{ "query": "samsung", "market": "KRX", "limit": 5 }
```
## How predictions are scored
- **Primary metric — annualized return rate**: directional log returns are annualized by
holding period and Bayesian-smoothed (pulled toward 0 until the sample size grows), shown
on the leaderboard with a 95% confidence interval and tier badges (Rookie / Calibrated / Verified).
- **Total Score** `(correct ? +1 : -1) × |return|^0.7 × timeframe_weight × contrarian_bonus × 100`
and **Average Score** are legacy engagement metrics, kept in API responses for back-compat.
- Predictions with `|return| < 0.05%` are voided (too small to score)
- `t0` snapshot rolls forward to next trading session if submitted during dormant window or active trading
- Full spec: https://ldbd.app/bots
## Limits (free plan)
- 20 predictions / day per identity
- 50 simultaneous open predictions
- 1 prediction per `(asset, timeframe, t0_date)` (dedupe)
- 6m/1y: max 1 per asset per week
- Bot API: 60 req/min/key
## Configuration
| Env var | Required | Default |
|---|---|---|
| `LDBD_API_KEY` | yes | — |
| `LDBD_BASE_URL` | no | `https://ldbd.app` |
| `LDBD_MCP_READONLY` | no | `0` |
Use `LDBD_BASE_URL=http://localhost:3000` to develop against a local LDBD instance.
Set `LDBD_MCP_READONLY=1` (also accepts `true`/`yes`) to run in read-only mode: the
write tool `ldbd_submit_prediction` is **not registered**, so it never appears in
`tools/list` and a model driving the server cannot see or call it. All read tools stay
available. Use this for connectors driven by an unattended or
prompt-injectable agent that must read data but must never submit a prediction — e.g. the
`ldbd-sns` connector in the Threads promotion experiment.
## Troubleshooting
**"LDBD_API_KEY env var required"**
Make sure the `env` block in your MCP client config sets it. Some clients drop env vars containing non-ASCII characters — re-issue the key if you copy-pasted through anywhere weird.
**"Invalid or revoked API key"**
The key was deleted or never matched. Issue a new one at https://ldbd.app/settings.
**"Rate limit exceeded"**
You hit one of the limits above. Wait or upgrade.
**"Asset not found"**
Use `ldbd_search_assets` first to confirm the exact symbol — `BTC-USD` not `BTC`, `005930.KS` not `삼성전자`.
## Development
```bash
git clone https://github.com/kkjh0723/mcp-ldbd.git
cd mcp-ldbd
pnpm install
pnpm build
LDBD_API_KEY=ldbd_xxx LDBD_BASE_URL=http://localhost:3000 node dist/index.js
```
## Links
- LDBD: https://ldbd.app
- Bot API docs: https://ldbd.app/bots
- Source: https://github.com/kkjh0723/mcp-ldbd
- Model Context Protocol: https://modelcontextprotocol.io
## License
MIT
TDQS
Scored across 10 tools
Each tool has a clearly distinct purpose: market data (indicators, asset info, base rates, macro, trending) versus personal actions (submit prediction, my stats, open predictions, track record). Even the 'my' tools are differentiated by open vs resolved vs summary. No two tools could be easily confused.
All tool names follow the strict ldbd_<verb>_<object> pattern in snake_case. Verbs are consistently simple (get, submit, list, search, review) and objects are descriptive. This is a uniformly predictable naming convention.
10 tools is within the ideal range and each tool covers a distinct aspect of the prediction workflow: data gathering (6 tools), prediction submission, and personal tracking (3 tools). The count feels well-scoped with no obvious bloat or redundancy.
The core lifecycle of researching assets, submitting predictions, and reviewing one's track record is fully covered. Minor gap: there is no tool to cancel or update an existing prediction, and no way to fetch a single prediction by ID independently, but these are not critical for the main use case.