app/finance/SKILL.md
Stocks (index snapshot + exchange index/company daily & hourly; TASI feed today), funds (six-digit OHLCV vs NAV daily), precious metals (XAUUSD via market/daily + Turso eastmoney-precious-spot) — pick the matching REST path.
npx skillsauth add davidkk/vercel-openapi financeInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
| Major | Meaning |
| ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Stocks | Stock market: multi-market index snapshot, exchange-scoped index daily, index hourly, constituent company daily — today only TASI is implemented for market= feed paths. |
| Funds | Six-digit daily data in two shapes: exchange daily bars (OHLCV) vs NAV disclosure (unit + daily %). |
| Precious metals | Spot XAUUSD daily OHLCV via GET /api/finance/fund/XAUUSD/ohlcv/daily (canonical; legacy market/daily?symbols=XAUUSD); Turso source=eastmoney-precious-spot. Only XAUUSD in scope today. |
GET /api/finance/stock/summary?market=... or batch markets=....GET /api/finance/stock/tasi/summary/daily (slug matches /finance/stock/tasi; no market= query). Legacy: GET /api/finance/market/summary/daily?market=TASI.GET /api/finance/stock/tasi/summary/hourly. Legacy: GET /api/finance/market/summary/hourly?market=TASI.GET /api/finance/stock/tasi/company/daily. Legacy: GET /api/finance/market/company/daily?market=TASI.GET /api/finance/stock/tasi/daily/latest returns { asOf, dataDate, summary, items } (index + all companies).GET /api/finance/fund/{symbol}/ohlcv/daily?startDate=...&endDate=... ({symbol} six-digit or XAUUSD; optional withIndicators=true adds MACD fields using legacy window cold-start by default; optional indicatorWarmup=true uses 120 calendar days; optional indicatorWarmupDays=35..250 sets the lookback; optional forceSync=true refreshes allowlisted cached ranges). Multi-symbol batch legacy: GET /api/finance/market/daily?symbols=....GET /api/finance/fund/{symbol}/ohlcv/daily/latest (same path shape as market/daily/latest). Legacy: GET /api/finance/market/daily/latest?symbols=....GET /api/finance/fund/{symbol}/nav/daily?startDate=...&endDate=.... Legacy: GET /api/finance/fund/nav/daily?symbols=....GET /api/finance/fund/{symbol}/nav/daily/latest. Legacy: GET /api/finance/fund/nav/daily/latest?symbols=....GET /api/finance/stock/tasi/summary/daily/latest, GET /api/finance/stock/tasi/company/daily/latest. Legacy: GET /api/finance/market/.../latest?market=TASI.stockList + MACD (latest bar per symbol, not full daily rows): GET /api/finance/overview/stock-list?symbols=...&startDate=...&endDate=... (optional syncIfEmpty).market= feed paths for non-TASI markets — they return 400; use /api/finance/stock/summary for other overview indices.market/... and stock/tasi/... are TASI-only in current implementation; non-TASI requests must be redirected to get_stock_summary.get_fund_nav_daily*, while OHLCV uses get_market_daily*.get_stock_summary directly.market, date, from/to, code from natural language; dates YYYY-MM-DD.code, from, to (plus market=TASI if omitted). If any missing, ask once — do not guess.from and to. If only one date, ask for the range.GET /api/finance/stock/summary
| Mode | Query |
| ------ | ---------------------------------------------------------------------------------------------- |
| Single | market=TASI (default) or market=S%26P%20500, Dow%20Jones, Nasdaq, … |
| Batch | markets=TASI,S%26P%20500,Dow%20Jones (comma-separated; same per-market cold-start as single) |
HTTP 200 body: { "code": 0, "message": "ok", "data": … } — single: data: { "market", "summary" }; batch: data: { "items": [...] }.
GET /api/finance/stock/tasi/company/daily — K-line if code + from + to present. Legacy: GET /api/finance/market/company/daily?market=TASI.
| Mode | Query |
| --------------------- | ----------------------------------- |
| Latest snapshot | market=TASI or omit market |
| Single historical day | date=YYYY-MM-DD |
| Company K-line | code=<ticker> from=... to=... |
GET /api/finance/stock/tasi/summary/daily — canonical (slug tasi). Legacy: GET /api/finance/market/summary/daily?market=TASI.
| Mode | Query |
| ------------ | --------------------------------- |
| Latest | (none) or market=TASI |
| Single day | date=YYYY-MM-DD |
| Index K-line | from=YYYY-MM-DD to=YYYY-MM-DD |
GET /api/finance/stock/tasi/summary/hourly — TASI only; no query params. Legacy: GET /api/finance/market/summary/hourly?market=TASI.
data → reuse.market=TASI; funds → market/daily vs fund/nav/daily vs overview/stock-list.{ code, message, data } on 200.data — never invent numbers.GET /api/finance/stock/summary?market=Nasdaq
GET /api/finance/stock/tasi/company/daily
GET /api/finance/stock/tasi/company/daily?date=2026-03-01
GET /api/finance/stock/tasi/company/daily?code=1120&from=2026-01-01&to=2026-03-01
GET /api/finance/stock/tasi/summary/daily
GET /api/finance/stock/tasi/summary/daily?date=2026-03-01
GET /api/finance/stock/tasi/summary/daily?from=2026-01-01&to=2026-03-01
GET /api/finance/stock/tasi/summary/hourly
GET /api/finance/stock/tasi/daily/latest
tool names as POST /api/mcp/finance)| Tool | Role |
| --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| get_stock_summary | Latest snapshot: market or markets (comma-separated). |
| get_market_company_daily | TASI company rows; optional market (default TASI); date or code+from+to. |
| get_market_summary_daily | TASI index daily / K-line; optional market (default TASI). |
| get_market_summary_hourly | TASI SAHMK alignment; optional market (default TASI). |
| get_market_daily | Exchange OHLCV only: symbols, startDate, endDate; optional withIndicators (legacy cold-start by default), indicatorWarmup (120 days), indicatorWarmupDays (35-250); optional syncIfEmpty (default true), optional forceSync. Fund NAV codes → get_fund_nav_daily. |
| get_market_daily_latest | Latest one OHLCV bar per symbol: symbols only; optional withIndicators (default true, pass false to skip MACD streak); optional syncIfEmpty (default true). Returns { asOf, items, synced }. |
| get_fund_nav_daily | Fund NAV only: same symbols / dates; optional syncIfEmpty (default true for allowlisted NAV catalog). Returns { items, synced } with unitNav + dailyChangePercent. |
| get_fund_nav_daily_latest | Latest one NAV row per symbol: symbols only; optional syncIfEmpty (default true). Returns { asOf, items, synced }. |
| get_market_summary_daily_latest | TASI index latest session; optional market (default TASI). Returns { asOf, dataDate, summary }. |
| get_market_company_daily_latest | TASI all companies latest session; optional market (default TASI). Returns { asOf, dataDate, items }. |
| get_overview_stock_list | Same date range + symbols; optional syncIfEmpty. Returns { stockList, synced } — one row per symbol (latest bar + MACD streak), not the full daily series (get_market_daily). |
Same envelope: { code: 0, message: "ok", data: … }. data may be [] or null on 200 — treat as no rows, not a transport error.
/api/finance/stock/summary: data is { market, summary } (single) or { items } (batch), not a bare ok flag./api/finance/fund/{symbol}/ohlcv/daily and legacy /api/finance/market/daily: data is { items, synced } with exchange OHLCV rows only (items[].open … turnoverRate; when withIndicators=true, ema12/ema26/dif/dea/macd plus macdUp/macdDown)./api/finance/fund/{symbol}/ohlcv/daily/latest and legacy /api/finance/market/daily/latest: data is { asOf, items, synced } — one latest bar; asOf is ISO-8601; items[].date is the bar’s calendar trade date./api/finance/fund/{symbol}/nav/daily and legacy /api/finance/fund/nav/daily: data is { items, synced } with fund NAV rows (items[].unitNav, items[].dailyChangePercent only)./api/finance/fund/{symbol}/nav/daily/latest and legacy /api/finance/fund/nav/daily/latest: data is { asOf, items, synced }./api/finance/stock/tasi/summary/daily/latest (legacy /api/finance/market/summary/daily/latest): data is { asOf, dataDate, summary }./api/finance/stock/tasi/company/daily/latest (legacy /api/finance/market/company/daily/latest): data is { asOf, dataDate, items }./api/finance/stock/tasi/daily/latest: data is { asOf, dataDate, summary, items }.GET /api/finance/stock/summary?market=Nasdaq.GET /api/finance/stock/tasi/summary/daily (or legacy GET /api/finance/market/summary/daily?market=TASI).GET /api/finance/stock/tasi/company/daily?code=1120&from=2026-01-01&to=2026-03-01.GET only; if TASI feed path returns 400, read message and prefer /api/finance/stock/summary for non-TASI index snapshots.
tools
When a user asks for weather or short forecast at a latitude/longitude → return current conditions or forecast.
data-ai
When a user asks whether today is a public holiday in mainland China → return holiday status/name.
development
When a user provides China latitude/longitude → reverse geocode to province/city/district.
tools
When a user asks for China Fuel Price by province or a recharge promo → return current/previous prices or promo result.