一屏搞定金融与产业研究的实时行情大屏:A股、港股、美股指数,大宗商品,美债收益率,板块热点,主力资金流,7×24 快讯,产业链自选股,AI 大模型 token 用量趋势。
68.3/100
综合分
429
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/30 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
自动兼容检查未通过:缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add theBigGavin/marketingdashboard该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · market
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 4 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包my-app @ 0.1.0
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明
源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/29 09:39:02
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 63 处,展示前 41 条)
- 发起网络请求public/sw.js:32
fetch(request).then((resp) => { - 写入本地文件server/demo-funnel.test.cjs:16
fs.mkdirSync(srcDir, { recursive: true }); - 写入本地文件server/demo-funnel.test.cjs:17
fs.mkdirSync(dataDir, { recursive: true }); - 读取本地文件server/demo-funnel.test.cjs:24
const st = fs.statSync(p); - 写入本地文件server/demo-funnel.test.cjs:25
fs.utimesSync(p, new Date(st.mtimeMs - ms), new Date(st.mtimeMs - ms)); - 写入本地文件server/demo-funnel.test.cjs:31
fs.writeFileSync(src, JSON.stringify({ pv: 100, uv: 10, seen: {} })); - 读取本地文件server/demo-funnel.test.cjs:34
const out = JSON.parse(fs.readFileSync(path.join(dataDir, "visits.json"), "utf-8")); - 写入本地文件server/demo-funnel.test.cjs:38
fs.writeFileSync(src2, JSON.stringify({ tasks: {} })); - 读取本地文件server/demo-funnel.test.cjs:40
assert.equal(fs.existsSync(path.join(dataDir, "demo", "status.json")), true); - 写入本地文件server/demo-funnel.test.cjs:47
fs.writeFileSync(src, "AAAA"); - 读取本地文件server/demo-funnel.test.cjs:52
assert.equal(fs.readFileSync(dest, "utf-8"), "AAAA"); - 读取本地文件server/demo-funnel.test.cjs:55
const before = fs.statSync(dest).mtimeMs; - 读取本地文件server/demo-funnel.test.cjs:57
assert.equal(fs.statSync(dest).mtimeMs, before); - 执行外部命令来自配置/变量server/dev.cjs:11
spawn(process.execPath, [path.join(__dirname, "index.cjs")], { - 执行外部命令来自配置/变量server/dev.cjs:16
spawn(process.execPath, [path.join(root, "node_modules", "vite", "bin", "vite.js")], { - 读取本地文件server/index.cjs:38
if (fs.existsSync(envPath)) { - 读取本地文件server/index.cjs:39
for (const line of fs.readFileSync(envPath, "utf-8").split("\n")) { - 读取本地文件server/index.cjs:205
try { arr = JSON.parse(fs.readFileSync(file, "utf-8")); } catch {} - 写入本地文件server/index.cjs:207
fs.writeFileSync(file, JSON.stringify(arr, null, 2)); - 读取本地文件server/index.cjs:651
fs.readFile(file, (err, buf) => { - 读取本地文件server/index.cjs:656
fs.readFile(path.join(file, "index.html"), (e3, dirHtml) => { - 读取本地文件server/index.cjs:666
fs.readFile(path.join(DIST, "index.html"), (e2, html) => { - 执行外部命令固定命令server/lib/fetch-any.cjs:40
execFile("curl", args, { maxBuffer: 4 * 1024 * 1024, encoding: "buffer" }, (err, stdout, stderr) => { - 发起网络请求server/lib/fetch-any.cjs:62
const resp = await fetch(url, { headers: h, signal: ctrl.signal }); - 读取本地文件server/lib/persist.cjs:10
try { return JSON.parse(fs.readFileSync(file, "utf-8") || "{}"); } - 写入本地文件server/lib/persist.cjs:17
fs.mkdirSync(path.dirname(file), { recursive: true }); - 读取密钥环境变量server/sources/ai-models.cjs:6
const AA_API_KEY = process.env.ARTIFICIAL_ANALYSIS_API_KEY || ""; - 读取密钥环境变量server/sources/ai.cjs:82
const apiKey = process.env.IWENCAI_API_KEY; - 发起网络请求server/sources/ai.cjs:94
const resp = await fetch(`${base}/v1/query2data`, { - 读取密钥环境变量server/sources/openrouter.cjs:6
const OR_KEY = process.env.OPENROUTER_API_KEY || ""; - 发起网络请求server/sources/openrouter.cjs:71
const resp = await fetch(url, { headers: { Authorization: `Bearer ${OR_KEY}`, Accept: "application/json" }, signal: AbortSignal.timeout(120000) }); - 发起网络请求server/sources/sunsirs.cjs:13
return fetch(url, { headers, signal: AbortSignal.timeout(timeout) }); - 发起网络请求src/lib/api.ts:331
const r = await fetch(`${API_BASE}${path}`, { signal: timeoutSignal(10000) }); - 发起网络请求src/lib/api.ts:349
const r = await fetch(`${API_BASE}${path}`, { signal: timeoutSignal(10000) }); - 发起网络请求src/lib/api.ts:363
const r = await fetch(`${API_BASE}${path}`, { - 发起网络请求src/lib/api.ts:416
const r = await fetch(quoteUrl(fresh)); - 发起网络请求src/lib/api.ts:431
const r = await fetch(tencentRankUrl(n, type, dir)); - 发起网络请求src/lib/api.ts:438
const r = await fetch(tencentMinuteUrl(code)); - 发起网络请求src/lib/hosting.ts:27
const r = await fetch(path, { ...init, signal: timeoutSignal(10000) }); - 发起网络请求src/lib/hosting.ts:49
const r = await fetch("/api/hosting/config", { signal: timeoutSignal(5000) }); - 发起网络请求src/lib/utm.ts:20
fetch(u, { method: 'GET', cache: 'no-store', mode: 'cors', referrerPolicy: 'no-referrer' })
扫描于 2026/11/2(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
界面预览
1 张 · 点击查看大图功能亮点
- 一屏实时行情大屏
- 多市场指数与大宗商品
- 板块热点与资金流
README
由 DeepSeek 最新模型翻译生成📊 Market Research Cockpit
一屏看全的实时行情面板,服务金融与行业研究
A 股 / 港股 / 美股 · 大宗商品 · 美债收益率 · 板块热力 · 资金流向 · 7×24 快讯 · 产业链自选
🚀 在线演示:https://mrd.hermes.cc.cd —— 不用 API key,不用登录,打开就能用
🛎️ 托管版:筹备中 —— 价格未定,上线时间也未定。想要托管部署、省掉自己跑服务器?告诉我们你在意什么。开源自托管永久免费,MIT 协议不变。
🏠 由 Gavin's Lab 打造 —— 一人公司,7 个 AI 智能体在看板上协作运转:公司主页 · 实时透明办公室
Market Research Cockpit screenshot
✨ 功能
- 🌍 全球市场一屏尽览 —— 上交所 / 深交所 / 恒生 / 道指 / 纳指 / 标普 500 / VIX / 美元兑人民币,指数分钟级走势图并排对比
- 🥇 大宗商品与加密货币 —— 纽约金银、伦敦金、上期所黄金、LME 铜、原油、BTC,实时价格配日内曲线
- 💵 美债监控 —— 10Y / 2Y 收益率、2s10s 利差、收益率曲线形态,以及回溯到 2001 年的逐月历史
- 🔥 板块热力雷达 —— 行业 / 概念板块排行;点开板块可下钻成分股、龙头股与资金流向
展开完整文档(README 剩余 1 节)
📊 Market Research Cockpit
一屏看全的实时行情面板,服务金融与行业研究
A 股 / 港股 / 美股 · 大宗商品 · 美债收益率 · 板块热力 · 资金流向 · 7×24 快讯 · 产业链自选
🚀 在线演示:https://mrd.hermes.cc.cd —— 不用 API key,不用登录,打开就能用
🛎️ 托管版:筹备中 —— 价格未定,上线时间也未定。想要托管部署、省掉自己跑服务器?告诉我们你在意什么。开源自托管永久免费,MIT 协议不变。
🏠 由 Gavin's Lab 打造 —— 一人公司,7 个 AI 智能体在看板上协作运转:公司主页 · 实时透明办公室
Market Research Cockpit screenshot
✨ 功能
- 🌍 全球市场一屏尽览 —— 上交所 / 深交所 / 恒生 / 道指 / 纳指 / 标普 500 / VIX / 美元兑人民币,指数分钟级走势图并排对比
- 🥇 大宗商品与加密货币 —— 纽约金银、伦敦金、上期所黄金、LME 铜、原油、BTC,实时价格配日内曲线
- 💵 美债监控 —— 10Y / 2Y 收益率、2s10s 利差、收益率曲线形态,以及回溯到 2001 年的逐月历史
- 🔥 板块热力雷达 —— 行业 / 概念板块排行;点开板块可下钻成分股、龙头股与资金流向
- 💰 资金流向追踪 —— 主力净流入个股榜、板块分钟级累计流入曲线、热门 / 涨幅 / 跌幅榜
- ⛓️ 产业链全景 —— 半导体、AI 算力、新能源车、机器人、创新药等;上中下游标的直连实时行情。股票列表可手动编辑,也可从问财自动抓取
- 🤖 AI 驾驶舱 —— 接入 OpenRouter 每日榜单 API,追踪全球 50+ 大模型服务商的 token 消耗趋势(7d–1y 区间),按服务商 / 国家 / 地区绘制堆叠面积份额图,历史跨度 60+ 天
- 💹 LLM 价格战观察 — 2×3 网格上的四个面板:TTSI 支出指数趋势(加权 / 闭源 / 开源价格线,0 起点坐标轴,多月完整历史,来自本地 ttsi.csv CC BY 4.0 存档,并与每日 RSS 尾部合并)、模型价格表(约 400 个模型,可按智能 / 输入 / 输出 / 任务成本排序)、性价比散点图(智能指数 × 任务成本,对数坐标轴,按厂商着色),以及价格下调 / 份额变动事件流,数据来自 TrakToken 每日标注
- 🪟 财报窗口(/fin) — 财报季宏观视图:披露日历(14 天节奏条 + 今日列表)、财报预测(超预期 / 不及预期统计条 + 利润区间明细)、行业利润排名(规模 × 动量双编码)、个股利润排名(按金额 / 增速),外加每家公司 12 个季度的趋势(营收 / 利润柱状图 + ROE / 毛利率 / 净利率折线图)
- 🏷️ 大宗商品价格页(/goods) — 6 大类主力合约期货日线趋势(贵金属 / 基本金属 / 黑色 / 能源化工 / 农产品 / 国际能源),支持 30d–365d 区间,外加生意社现货报价(每日累积)和现货–期货基差表
- 📰 7×24 快讯 — 滚动播报全球财经新闻,自动高亮宏观关键词和产业链提及
- 🖥️ 可安装桌面应用 — 内置 PWA 支持(Web Manifest + Service Worker);从浏览器地址栏安装,在独立窗口中运行
- 🍎 原生 macOS 应用 — Swift WKWebView 薄壳,沿用 Android TV 的同一套模式
- 📺 Android TV 应用 — 原生 WebView 外壳(android-tv/),支持方向键空间导航、全屏面板缩放(等比缩放 + 幻灯片)、翻牌式行情条,针对旧版引擎和弱 GPU 调优
- 📱 iOS Scripting 脚本 — TypeScript/TSX 脚本(scriptable/,镜像到 theBigGavin/mrd-scripting),把驾驶舱包进 Scripting 应用的 WebView:通过 ?tv=1 进入 TV 模式,强制横屏,无安全区全屏,Liquid Glass 退出按钮,本地启动屏带 mrd logo(呼吸动画),进入实时仪表盘时不会白屏
- ⚡ 零依赖数据服务 — 内置 Node 代理聚合公开行情数据端点,带内存缓存;多数端点无需 API key,开箱即用
🏗️ 架构
flowchart LR
subgraph External data sources
A[Tencent Quotes] --> D
B[Sina Finance] --> D
C1[Eastmoney] --> D
C2[Wallstreetcn] --> D
C3[CNBC / Binance] --> D
C4[iwencai] --> D
C5[OpenRouter rankings] --> D
C6[Artificial Analysis API] --> D
C7[TrakToken TTSI RSS] --> D
end
subgraph This project
D["Node data proxyin-memory TTL cache"] -->|"/api/"| E["React 19 frontendpolling refresh"]
E --> F[One-screen cockpit UI]
end
- 前端优先使用内置的 Node 代理;代理不可用时,部分接口(腾讯 / 华尔街见闻)会优雅回退到浏览器直连
- 统一客户端行情中枢:所有面板的价格 / 涨跌都来自同一个客户端行情中枢(src/lib/market.ts),它每 5s 批量拉取一次,再分发同一份快照——同一个 ticker 在任何地方渲染出的都是同一帧;服务端行情按代码缓存(5s,与客户端轮询节奏对齐),自选集合变化时只拉取新增的代码
- 每个接口各有服务端缓存 TTL(行情 5s,板块成分最长 24h),容量有上限(LRU + 定期清扫),不用数据库,不用外部存储
- 大量并发用户下对上游友好:按代码的 TTL 缓存 + 进行中请求去重,让并发缓存未命中共享同一次上游拉取;失败退避(5s→2min 负缓存)避免打爆已经挂掉的上游;浏览器直连回退按代码限流;/api/stats 暴露请求 / 上游拉取 / 429 计数
- 服务端每 4 小时采集一次现货价格,写入本地历史文件——前端不在线,历史也一天天增长
- 单进程生产部署:一个端口同时提供 API 和构建好的前端
🧱 产品边界(红线)
本仓库只服务于 mrd 产品(行情数据驾驶舱)。OPC 透明办公室、公司官网、市场、客户支持相关的代码 / 数据 / 凭据 / 测试绝不能落在这里——它们各自住在自己的仓库:
| 产品 / 服务 | 仓库 | 公网域名 |
| mrd(本仓库) | theBigGavin/marketingdashboard | mrd.hermes.cc.cd |
| OPC 后端(opc-api) | theBigGavin/opc-os · opc-api/(私有) | opc.hermes.cc.cd |
| 公司官网后端 | theBigGavin/company-site-backend | api.hermes.cc.cd |
| 公司官网前端 | theBigGavin/gavin-lab-company | www.hermes.cc.cd |
| knock 排行榜 | theBigGavin/mylauncher · server/ | hermes.cc.cd/api/v1/knock |
规则:
- 新 API 挂到各自的产品域名下;跨产品调用走所属产品的后端——绝不在这里添加其他产品的路由或反向代理。
- 敏感凭据只存在于所属仓库被 gitignore 的 server/.env 里。本仓库只保留 mrd 自己的 key:IWENCAI_BASE_URL / IWENCAI_API_KEY / OPENROUTER_API_KEY / ARTIFICIAL_ANALYSIS_API_KEY。
- 守卫:合并前运行 scripts/check_product_boundary.sh(手动或 CI)——FAIL 说明混进了非 mrd 代码。它把 /api/rank、qq-rank、/api/leads、/api/v1/knock 和 /company/opc/status.json(遗留静态服务,P0-1 已停止更新,为白名单保留)视为 mrd 自有,不会报错。
🚀 快速开始
前置条件
- Node.js 18+
- 系统里有 curl(部分代理接口会用到)
本地开发
npm install # or pnpm install
npm run dev
- 前端开发服务器:<http://localhost:3000>
- 数据代理:<http://localhost:3001>(Vite 会自动把 /api 代理到它)
生产环境
npm run build # builds to dist/
Optional: configure API keys (AI panels)
echo 'OPENROUTER_API_KEY=sk-or-v1-xxxx' > server/.env # AI cockpit usage panel
echo 'ARTIFICIAL_ANALYSIS_API_KEY=aa_xxxx' >> server/.env # LLM price panels
Optional: full TTSI history — download ttsi.csv from traktoken.com and place it at server/data/ttsi.csv (CC BY 4.0). Without it the trend panel falls back to the 60-day RSS tail automatically.
npm start # single process, visit http://localhost:3000
Docker
docker build -t market-cockpit .
docker run -p 3000:3000 market-cockpit
安装为桌面应用(PWA)
在 Chrome / Edge 中打开已部署的页面,点击地址栏右侧的安装图标(或菜单 →「Install Market Research Cockpit」),即可把它当作独立桌面应用运行。静态资源会离线缓存,应用有自己的图标。
注意:行情数据实时拉取,离线时只有应用外壳可用。
macOS 桌面应用
macos/ 目录里是原生 Swift WKWebView 外壳。做法和 Android TV 一样:给同一套 Web UI 套一层轻量原生窗口。
前置条件:Xcode
open macos/MarketCockpit.xcodeproj # Open in Xcode, press ⌘R to build & run
默认加载 http://localhost:3000/?desktop=1(先运行 npm start)。
Android TV 应用
android-tv/ 目录里是原生 WebView 外壳(零第三方依赖),把驾驶舱搬到 Android TV 和机顶盒上。Web 应用通过 ?tv=1 进入 TV 模式,与桌面版共用同一套代码。
遥控器操作模型
- 方向键空间导航:面板、导航链接、标签页和滚动区域都能获得焦点(青色高亮环)。打分依据是边缘距离 + 轴向重叠,正前方的候选总能胜出
- OK:放大面板 / 触发按钮 / 切换页面
- 放大 = 全屏浮层:面板铺满屏幕,背后压一层暗色背景,内容按比例放大(CSS zoom,上限 3 倍),其他面板原地不动——零重排
- 浮层内:←/→ 以幻灯片方式切到相邻面板;↑/↓ 滚动内容(滚到顶部后再按一次 ↑ 跳到标签栏);标签页、榜单行和成分股侧栏都能到达并操作
- 返回:先还原放大的面板 → 再回退历史 → 最后退出;菜单:修改服务器 URL
- 翻牌行情条:顶部报价条像机场出发牌——7 张等宽卡片,每隔几秒翻一张(整条滚动层对性能弱的 TV GPU 负担太重,翻牌只重绘一小块区域)
- 启动画面:呼吸式 logo + 进度指示,页面就绪后淡出
TV 模式适配(不影响桌面端)
- 固定 1920 CSS-px 视口,任何电视密度下布局和字号都保持一致;外壳根据屏幕的 dp 宽度计算初始缩放,正好铺满
- 兼容旧引擎(< Chromium 88):为 :where()、inset 和 flex gap 提供回退方案
- 弱 GPU 优化:关闭模糊、阴影和动画,时钟和倒计时按分钟跳动,长列表裁剪(榜单 200→40,新闻 60→25,排行 30→15),行情轮询从 5s 放慢到 10s
- 角落的调试徽标:WebView 引擎版本 · 构建时间 · 实时 FPS · JS 堆内存 · 行情心跳(用来区分「轮询坏了」还是「休市」)
安装
1. 构建 APK:cd android-tv && ./gradlew assembleDebug —— 产物在 app/build/outputs/apk/debug/app-debug.apk
2. 侧载到电视(adb install app-debug.apk,或用 U 盘拷贝)
3. 应用默认连接公开部署 https://mrd.hermes.cc.cd —— 开箱即用;随时按遥控器的菜单键切换到局域网地址(在电脑上运行 npm start,然后输入 http://<computer-ip>:3000)
iOS Scripting 脚本
scriptable/ 目录里有一个 Scripting app(scripting.fun)脚本,在原生 WebView 里呈现驾驶舱。它同时镜像为独立仓库 theBigGavin/mrd-scripting,可以直接导入。
功能
- 加载 https://mrd.hermes.cc.cd/?tv=1 —— TV 模式(方向键空间导航、点按缩放面板、触摸滑动切换)
- 强制横屏、无标题栏、无安全区全屏(ignoresSafeArea)
- Liquid Glass 退出按钮(buttonStyle="glass",iOS 26)
- 本地启动屏:mrd logo 带呼吸动画 + 加载指示器,然后无缝暗色过渡进仪表盘(没有白屏闪烁)
安装(一键)
在 iPhone 上打开导入链接(需要 Scripting app,iOS 26+):
https://scripting.fun/import_scripts?urls=%5B%22https%3A%5C%2F%5C%2Fgithub.com%5C%2FtheBigGavin%5C%2Fmrd-scripting%5C%2Ftree%5C%2Fmain%22%5D
或者从 scriptable/ 分享 mrd-dashboard.scripting 文件。如果已存在同名脚本,重新导入前先删掉,避免缓存冲突。
重新打包:.scripting 是一个 zip(STORE 方式,flag_bits=2048 用于 UTF-8 文件名,zip 版本 20,DOS 日期 2020),包含 index.tsx、page.tsx 和 script.json。用 python3 scriptable/package.py 重新构建。
📡 API 概览
开发期间前端通过 /api 与本地代理通信:
| 端点 | 说明 |
| /api/quotes?codes=... | 实时指数 / 股票行情 |
| /api/minute?code=... | 分时分钟序列 |
| /api/boards?type=...&dir=...&n=... | 行业 / 概念板块排行 |
| /api/board-stocks?code=...&n=... | 板块成分股 |
| /api/futures?list=... | 商品 / 加密货币行情 |
| /api/future-minute?code=... | 期货分时序列 |
| /api/future-daily?code=...&n=... | 期货日 K 线(最近约 400 根;国内 nf_ / 国际 hf_) |
| /api/spot-table | 生意社现货–期货表(现货 / 期货 / 基差;现货历史按日累积) |
| /api/chem-spot?id=...&name=... | 生意社化工现货报价(市场中位价,历史按日累积) |
| /api/rank?sort=...&n=... | 股票排行榜(涨幅 / 换手 / 成交量) |
| /api/moneyflow?n=... | 主力净流入排名靠前的股票 |
| /api/stock-flows?codes=... | 批量查询个股资金流 |
| /api/board-flow?n=... | 板块资金流曲线 |
| /api/stock-boards?code=... | 股票所属板块(行业 / 地区 / 概念) |
| /api/news?page=...&size=... | 7×24 财经快讯 |
| /api/treasuries | 美国国债收益率实时数据 |
| /api/treasury-history | 美国国债收益率月度历史(2001 年至今;本地存档在 server/treasury-rates/,当年数据实时补齐) |
| /api/mystery-select?query=...&limit=... | 问财选股(按概念 / 行业) |
| /api/finance-main?code=... | 单家公司财务摘要,最近 12 期(东方财富 F10:营收 / 利润 / ROE / 利润率……) |
| /api/finance-board?period=... | 业绩宏观汇总(利润前 50 个股 + 前 15 行业汇总 + 近期披露日历) |
| /api/finance-forecast?period=... | 业绩预告(利润区间 / 同比 / 类型 + 超预期–不及预期统计) |
| /api/chain-parse | 产业链文本解析(按段落标题自动归入上游 / 中游 / 下游) |
| /api/openrouter-usage | OpenRouter 日榜(服务商 token 消耗,本地持久化缓存) |
| /api/aa-models | Artificial Analysis 全量模型定价(约 600 个模型:智能指数、每 1M token 输入/输出价格、任务成本;24 小时缓存 + 每日快照累积到 server/data/model-prices.json) |
| /api/spend-index | TrakToken TTSI 支出指数(本地 ttsi.csv 全量历史与每日 RSS 增量合并,另含降价 / 份额变化事件) |
| /api/stats | 运行时可观测性:请求 / 上游抓取 / 429 计数、运行时长 |
| /api/stock-search?q=... | 股票搜索(名称 / 拼音首字母 → 代码,新浪联想接口代理) |
| /api/health | 健康检查 |
注意:/api/mystery-select 和 /api/openrouter-usage 使用服务端私有 API key,只接受同源页面请求(跨域返回 403);/api/aa-models 需要在 server/.env 里配置 ARTIFICIAL_ANALYSIS_API_KEY,但接口本身保持公开(缓存 24 小时)。所有 API 只对同源页面回显 CORS Origin,并按客户端 IP 限流(公开接口 2400 req/min,私有接口 30 req/min;超出返回 429;走 Cloudflare Tunnel 时从 CF-Connecting-IP 取真实客户端 IP)。POST 请求体上限 256KB,未匹配的 /api/ 路由返回 404 JSON。
🤖 MCP Server(Phase 1.5)
mrd 内置 MCP 服务器,AI 智能体可以直接调用行情数据工具。无需额外依赖——它跑在同一个 Node.js 进程里,复用共享的 cached() 内存缓存。
协议:JSON-RPC 2.0,基于 Streamable HTTP 传输(服务端向客户端推送用 SSE,请求用 POST)。
端点
| 方法 | 路径 | 说明 |
| GET | /mcp | 服务器元数据:版本、工具列表、资源列表 |
| POST | /mcp | JSON-RPC 2.0 请求(initialize / tools/list / tools/call / ping …) |
| GET | /mcp/stream | SSE 流,接收服务端主动发出的通知 |
认证
公开的 MCP 工具不需要 API key。私有端点(/api/mystery-select、/api/openrouter-usage)不通过 MCP 暴露,需要单独配置各自的 key。
工具列表(5 个公开工具)
| 工具 | 说明 |
| get_quotes | A 股 / 港股 / 美股 / 外汇实时行情。输入:逗号分隔的代码,例如 sh000001,sz399001,hkHSI,usNVDA |
| get_boards | 板块热度排行。type:01(A 股行业)/ 02(A 股概念)/ 03(港股行业)/ 05(美股);dir:0 降序 / 1 升序 |
| get_futures | 商品与加密货币期货。默认列表:纽约金、现货金、白银、加元、原油、VIX、国内金、BTC |
| get_money_flow | A 股主力资金净流入排行(东方财富为主,新浪兜底) |
| get_news | 新浪 7×24 财经快讯。page(默认 1)、size(默认 40) |
资源
| URI | 说明 |
| mrd://health | 服务器健康状态 |
| mrd://stats | 缓存大小与运行时统计 |
快速开始
Start the server
npm start
1. Discover — get server metadata
curl http://localhost:3000/mcp
2. Initialize (required first call)
curl -X POST http://localhost:3000/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}'
3. List tools
curl -X POST http://localhost:3000/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}'
4. Call a tool — get A-share index quotes
curl -X POST http://localhost:3000/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc":"2.0","id":3,"method":"tools/call",
"params":{
"name":"get_quotes",
"arguments":{"codes":"sh000001,sz399001,hkHSI,usNVDA"}
}
}'
5. Get sector rankings
curl -X POST http://localhost:3000/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc":"2.0","id":4,"method":"tools/call",
"params":{
"name":"get_boards",
"arguments":{"type":"01","dir":"0","n":"10"}
}
}'
6. Ping (keep-alive / health check)
curl -X POST http://localhost:3000/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":5,"method":"ping","params":{}}'
配合 Claude Desktop 使用
把下面这段加到 ~/.config/claude/desktop.yaml(或对应的配置文件):
mcpServers:
mrd:
command: npx
args:
- -y
- @modelcontextprotocol/server-http
- http://localhost:3000/mcp
重启 Claude Desktop。5 个 MRD 工具会自动出现在工具面板里。
缓存
所有工具响应都缓存在服务器的共享内存里:
| 数据 | 缓存 TTL |
| 行情(get_quotes) | 5 s |
| 板块排行(get_boards) | 5 s |
| 期货(get_futures) | 15 s |
| 资金流向(get_money_flow) | 8 s |
| 新闻(get_news) | 8 s |
同一份数据的并发请求共用一次上游拉取(inflight 去重)。上游出错时触发指数退避——缓存继续返回旧数据,不把错误抛给调用方。
DSH / DeepSeek Harness 兼容性
MCP 协议不绑定智能体框架。mrd 可以被 DeepSeek Harness 插件、LangChain 工具或任何 MCP 客户端调用。服务器通过 User-Agent 请求头自动识别 DSH 兼容客户端,并套用适合 DSH 的缓存 TTL。
在 DeepSeek Harness 内安装(零密钥、远程端点、无需本地服务器):
dsh plugin --profile web add github:theBigGavin/marketingdashboard
dsh.bundle 清单通过内置的 @deepseek-ai/dsh-mcp-client 桥接 https://mrd.hermes.cc.cd/mcp;5 个工具以 mcp__mrd__ 的形式出现。mrd 也收录在 DSH 社区目录中(GitHub dsh-plugin 话题、awesome-dsh-plugin 精选注册表)。
🗂️ 项目结构
├── server/
│ ├── dev.cjs # Dev entry: starts Vite and the data proxy together
│ ├── index.cjs # Data proxy + production static file serving
│ └── data/ # Runtime-accumulated data (gitignored): spot-history.json,
│ # model-prices.json, ttsi.csv (optional full TTSI history)
├── macos/ # macOS desktop app (Swift + WKWebView)
│ ├── MarketCockpit.xcodeproj
│ └── MarketCockpit/
├── src/
│ ├── App.tsx # Cockpit layout & routing (/ market cockpit, /ai AI cockpit, /goods commodity prices, /fin earnings window)
│ ├── AiDashboard.tsx # AI cockpit page (2×3 grid: OpenRouter usage spanning two rows + 4 LLM price panels)
│ ├── FinDashboard.tsx # Earnings window page (panels in components/dash/fin/)
│ ├── GoodsDashboard.tsx # Commodity prices page (6-group trend panels + spot/basis panel)
│ ├── components/
│ │ └── dash/ # Cockpit panels + shared UI primitives
│ │ ├── fin/ # Earnings window panels (calendar, forecast, industry rank, stock rank, company, trend, peer comparison)
│ │ │ ├── FinContext.ts # Shared company selection & reporting period state
│ │ │ └── utils.ts # quarterLabel, forecastTone (re-exports from lib/)
│ │ ├── Spark.tsx # Mini sparklines (A-share / 24h continuous / daily session axes)
│ │ ├── SharedUI.tsx # TabBar(分段控件)、AsyncContent(加载/错误/空状态包装器) │ │ └── ... │ ├── config/ # 指数、商品、产业链、商品组的静态配置 │ ├── hooks/ # 共享钩子 │ │ ├── usePolling.ts # 按组件轮询(隐藏标签页暂停、请求进行中保护) │ │ ├── useSharedPolling.ts # 同 key 组件通过 useSyncExternalStore 共用一个定时器 │ │ ├── useElementSize.ts # ResizeObserver → {ref, size},用于 SVG 自动定尺寸 │ │ ├── useStockSearch.ts # 防抖搜索 + 下拉框 + 键盘导航,供选股器使用 │ │ └── ... │ └── lib/ # API 客户端、统一行情中枢、共享工具 │ ├── market.ts # MarketHub:引用计数的行情订阅,单个 5s 轮询循环 │ ├── api.ts # 带类型的 fetch 封装(优先走服务端,浏览器直连兜底) │ ├── format.ts # fmtPrice、fmtPct、fmtYi、fmtWan、clsChg、hexChg、TNUM…
│ ├── code.ts # normalizeStockCode / toMarketCode —— 股票代码前缀归一化 │ └── storage.ts # loadJson / saveJson —— 带错误处理的类型化 localStorage └── docs/ # 截图和其他文档资源
🛠️ 技术栈
- 前端:React 19 · Vite 7 · TypeScript · Tailwind CSS · lucide-react 图标(图表为手写 SVG)
- 后端:Node.js 原生 http(无框架)· curl / fetch
- 数据源:腾讯、新浪、东方财富、华尔街见闻、CNBC、Binance、生意社、OpenRouter、Artificial Analysis、TrakToken 等公开行情数据接口
⚠️ 免责声明
本项目仅用于学习和研究。所有行情数据来自公开网络接口,可能延迟或不准确。本项目不构成任何投资建议。
🤝 参与贡献
欢迎提交 Issue 和 PR:
1. Fork 本仓库
2. 创建 feature/xxx 分支
3. 提交并推送你的改动
4. 发起 Pull Request
📄 许可证
Star 历史
MIT预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
theBigGavin/marketingdashboard
一屏搞定金融与产业研究的实时行情大屏:A股、港股、美股指数,大宗商品,美债收益率,板块热点,主力资金流,7×24 快讯,产业链自选股,AI 大模型 token 用量趋势。
相关插件 · 市场 / 管理
插件精选列表awesome-dsh-plugin/awesome-dsh-plugin
DeepSeek Harness(dsh)插件精选列表
★ 22,025未汉化DSH
73.6
新词雷达zhuyansen/new-term-radar
new-term-radar新词雷达
★ 2,049已汉化MCP
72.8
插件生态导航0xsline/awesome-deepseek-harness
安装 贡献指南 DeepSeek Docs 公开插件目录 Issues
★ 1,188已汉化DSH
72.6
技能注册中心iflytek/skillhub
企业级开源智能体技能注册中心——发布、发现并管理组织内可复用的技能包。
★ 5,358已汉化DSH
71.9
插件市场目录imsai-sh/awesome-deepseek-harness-plugins
面向 DeepSeek Harnessdsh生态的社区插件目录,共收录 13938 个插件含 PR 收录与…
★ 350已汉化DSH
71.8
插件精选清单Anil-matcha/awesome-dsh-plugin
DeepSeek Harnessdsh精选指南——DeepSeek…
★ 1,013已汉化DSH
71.7