Skip to main content
Glama
README.md
# dsh-bili-feed

把 B 站的热榜 / 搜索 / 视频详情 / 弹幕,做成 [DeepSeek Harness](https://github.com/deepseek-ai)(DSH)里可以直接调用的 MCP 工具。

**不登录、不需要 Cookie、零依赖、不花钱。** 一个文件几十行,装完 IDE 里就有 `mcp__bili__*` 五个工具。

> Bilibili hot list / search / video detail / danmaku as MCP tools for DeepSeek Harness. No login, no cookie, no dependencies.

---

## 装

DSH 的插件是挂在某个 profile 上的。以 `web` profile 为例(Windows 下的默认路径是
`%APPDATA%\dsh-desktop\harness\profiles\web`):

1. 在 `profiles/web/package.json` 的 `dependencies` 里加一行:

   ```json
   "dsh-bili-feed": "github:Doomsgeats/dsh-bili-feed"
   ```

2. 在同一个文件的 `dsh.profile.bundles` 数组里加一项:

   ```json
   "dsh-bili-feed"
   ```

3. 在 profile 目录里装依赖:

   ```bash
   pnpm install
   ```

4. 重启 DSH。之后模型就能看到 `mcp__bili__bili_hot`、`mcp__bili__bili_search`、
   `mcp__bili__bili_video`、`mcp__bili__bili_danmaku`、`mcp__bili__bili_week`。

**为什么是 bundle 而不是直接往 `cordis.patch.yml` 里抄一段配置**:这个包里的
`cordis.patch.yml` 用 `ctx.biliFeed.node` / `ctx.biliFeed.server` 读自己装在哪,
所以仓库里**没有写死任何绝对路径**。你 clone 到 D 盘、C 盘、还是别的机器,都不用改配置。

### 环境变量(可选)

| 变量 | 默认 | 作用 |
| --- | --- | --- |
| `BILI_MCP_SERVER` | `bili` | 工具命名空间,最终名字是 `mcp__<它>__<工具>` |
| `DSH_BILI_NODE` | 跑 DSH 的那个 node | 用哪个 node 起 MCP server |

## 用

装好之后,直接跟模型说话就行:

- 「B站今天有什么热的」→ `bili_hot`
- 「搜一下三角洲 S12 的新爆料」→ `bili_search`
- 「这个 BV 号播放多少、简介讲了什么」→ `bili_video`
- 「这视频弹幕都在刷什么」→ `bili_danmaku`
- 「每周必看这期有什么」→ `bili_week`

也可以完全不进 DSH,当命令行用(需要 Node ≥ 22):

```bash
node lib/bili.mjs hot 10
node lib/bili.mjs search "三角洲 新赛季" 1
node lib/bili.mjs video BV1GJ411x7h7
node lib/bili.mjs danmaku BV1GJ411x7h7 12
node lib/bili.mjs week
```

## 工具

| 工具 | 入参 | 返回 |
| --- | --- | --- |
| `bili_hot` | `count` 1–50,默认 12 | 综合热门榜:标题、UP主、播放量、时长、分区、BV号 |
| `bili_search` | `keyword`、`page` | 搜索结果列表,同上字段 |
| `bili_video` | `bvid` | 标题 / UP主 / 分区 / 时长 / 发布 / 播放·弹幕·点赞·投币·收藏·评论 / 简介 / cid |
| `bili_danmaku` | `bvid`、`top` | 刷得最多的一批弹幕 + 末尾最新几条 |
| `bili_week` | 无 | 「每周必看」 |

## 为什么返回纯文本而不是 JSON

因为它的下游是**模型**,不是程序。B 站热榜原始 JSON 约 172 KB(≈4.5 万 token),
搜一页 32 KB,直接塞进上下文既贵又吵。这里统一压成「一行标题 + 一行元信息」,
一次查询几百 token,模型该知道的都在。

想拿原始 JSON 的话,去 `lib/bili.mjs` 里把 `getJSON` 的返回值直接 `console.log` —— 代码就是文档。

## 已知边界(说清楚,别指望它做不到的事)

- **没有登录态**:拿不到推荐流、关注动态、播放历史、字幕。这些接口都要 Cookie。
- **搜索接口目前免签名**,B 站随时可能加 wbi 签名或验证码,挂了就得跟。
- **热榜走的是 `popular` 而不是 `ranking/v2`**:后者现在会撞风控(`code=-352`),
  代码里写了 `popular` 优先、失败回退 `ranking`。
- **弹幕只取当前第一 P**。多 P 视频要自己按 cid 拉。
- 只读。不会登录、不会点赞、不会发弹幕。

## 验证

`lib/mcp-server.mjs` 是手写的 stdio JSON-RPC(不到两百行),这样这个包**一个运行时依赖都没有**。
用官方的 `@modelcontextprotocol/sdk` 当客户端验过:

```
工具: bili_hot, bili_search, bili_video, bili_danmaku, bili_week
bili_hot 前 100 字: # B站热门(popular)2026/10/22 16:48:25(2 条) | 1. 《影之刃零》最终预告 ...
bili_video 首行: # 【官方 MV】Never Gonna Give You Up - Rick Astley  (BV1GJ411x7h7)
空参数 isError: true | bili_search 失败:keyword 不能为空
```

握手、`tools/list`、`tools/call`、错误分支都通。

## License

MIT。B 站的数据归 B 站和各自 UP 主;这个包只是把公开接口读出来给你自己看。