bilibili-info-gathering
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PYTHONPATH | Yes | Python import path pointing to the installed project's src directory, e.g. <install dir>/src. The README states this env var is not optional for starting the MCP server. | |
| BIG_OUT_DIR | Yes | Output directory for generated reports and image contacts. The README states this env var is not optional because the MCP client may not launch the stdio subprocess with a working directory, and image and asset-library paths depend on this anchor. | |
| BILI_SESSDATA | No | Bilibili login session cookie for fetching subtitles. Optional; no credentials are built in. Can alternatively be provided via a local file. | |
| BIG_REGISTRY_DIR | Yes | Directory for the local asset registry, video index, insight library, and call ledger. The README states this env var is not optional because registry paths depend on this anchor. | |
| PYTHONIOENCODING | Yes | Python stdio encoding. Set to utf-8. The README states this env var is not optional and was added for a real Windows pipe issue. | |
| PYTHONUNBUFFERED | Yes | Disable Python output buffering. Set to 1. The README states this env var is not optional and was added for a real Windows pipe issue. | |
| BIG_RATE_LIMIT_MS | No | Request rate limit in milliseconds. Default is 400ms. | 400 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| search_videosA | 用一个关键词搜索视频,返回完整元数据(自带播放/弹幕/评论/收藏/标签,无需二次调用)。 用途:试探某个词族能覆盖多少样本;或在 scan_topic 之后补充搜索。 注意:limit 上限 50(上游实测值)。numResults 恒为封顶 1000,不能当总数用。 常规广扫请直接用 scan_topic,不要连这个循环调用。 |
| scan_topicA | 阶段 1 广扫的唯一入口:多关键词搜索 → 去重 → 排序 → 对头部候选拉评论(含低成本判图)。 一次调用替代原来的「N 次搜索 + M 次元数据 + M 次评论」。返回: · candidates:全部候选的完整元数据 + 命中词族数 + 每千播放互动率 · digest:只有排序靠前的 comment_budget 条带评论摘要与评论区结构指标 · digest[].images:热评带图时的 160px 微表(判"这图是什么类型",读不出数字) · coverage:每个关键词命中数、去重后总数、跨词族命中数、样本偏差声明 · degraded / ok / cost:本次的降级信号、是否完整、以及实际开销 参数取舍:
keywords 建议 4–6 个,覆盖 同义词/上位词/下位词/黑话/英文 五类
per_query 每个词取多少条(≤50;取 30 通常已进入长尾)
comment_budget 花评论预算的条数。默认 12:再多也读不动,再少会漏掉侧面
comment_n 每条候选读多少条热门评论。默认 15——8 条看不到"高赞反方"这一层
image_policy "hot"(默认)热评里有图就判;"off" 最快;"all" 不论有没有都尝试
image_top 每条候选最多拼几张热评图,默认 6
families 强烈建议传:{"上位词": [...], "产品名": [...], "黑话": [...]}。
排序键会改成「命中的不同语义族数 → 族内命中数 → 播放量」。
不传时 offset(批次 D2)
跳过排序后的前 N 条,取下一批。用来解决「召回 835 条、只返回 50 条」的断层:
候选池没变,只是分页看。 exclude_topic(批次 D3 · 增量模式)
传议题名,自动把 排序规则(传了 families 时,批次 D2):标题/简介强命中的不同族数 → 命中的不同族数 → 命中关键词数 → 字段权重 → 播放量(log)。 强命中族数是为了压掉「靠标签蹭进来」的候选——B 站搜索是模糊匹配, 标签沾边就能命中很多关键词。 |
| get_metadataA | 批量取完整元数据(含 cid/pages、标签、简介全文)。 ⚠️ 广扫阶段不需要它——搜索结果已经带了元数据。只有这两种情况用: ① 你只有一个 BV 号,没有搜索结果; ② 需要 cid 去拉字幕/弹幕(get_transcript / get_danmaku 内部已自动处理,通常也不用)。 🔴 分 P 视频必看:返回里的 |
| get_commentsA | 取顶层评论 + 评论区结构指标。 detail 三档,按成本递增:
stats 里的关键量(判读口径固定在前 100 条顶层,不随 n 漂移): picture_like_share 「图片评论占总赞」——决定要不要读图(≥15% must,≥5% sample) reply_intensity 平均每层楼中楼数 —— 争论强度(点赞是"认同",回复是"争议") reply_to_like 楼中楼总数/赞总数 —— 评论活跃度 level_count 等级分布 —— 社区结构(高等级占比高 = 老用户为主) locations IP 属地分布 —— 地域结构,属于个人信息,不要写进可分享的产物 n 是顶层评论条数上限,楼中楼不占名额。n<100 时 picture_verdict 不返回(口径不可比)。 sanitize(默认 "flag"):给命中指令注入特征的评论追加 ⚠️ 命中不等于"这条在攻击 Agent":本检测是纯关键词匹配, 只能当"值得再看一眼"的提示,不能当证据。 |
| get_transcriptA | 取字幕,默认带压缩——这是阶段 2 里最容易把上下文打爆的一步。 三种用法,按成本从低到高: head_ratio=0.2 只读前 20%(离场规则的判断依据:核心关键词还没出现就退出) query="关键词" 只返回命中句 ±2 句上下文(省 80–95% token,优先用这个) 都不给 返回全量(长视频会非常贵,慎用) 返回 data_source 字段: "subtitle" 人工 CC —— 可以当引用 "ai_subtitle" AI 字幕 —— 不可当引用。技术类视频术语错一个,后面所有推论 都建立在错的前提上。用它定位、不用它举证。 page:多 P 视频取第几部分(默认 1)。越界会明确报错,不会静默回落到 P1。
分P数 > 1 时返回里带 |
| get_danmakuA | 取弹幕并压成"位置信号":密度曲线、最密时段+样本、高重复句、披露关键词。 为什么值得单独一条通道:弹幕是秒级的,能直接对上口播段落;评论只有发表时间。 而且广告披露常常只在弹幕里(实测某期简介无标注,弹幕 t=635s 直接写了"本期推广…")。 用途限制(重要):只用在两处—— ① 「延伸发散」:某段弹幕密度暴涨,往往就是观众认为信息量最大的地方; ② 「评论区结构性偏差」:弹幕 vs 评论说的事不一样,说明受众分层。 不要为它单开一章,也不要拿弹幕当"多数人意见"的证据(弹幕是即时反应,不是判断)。 page:多 P 视频取第几部分(默认 1)。越界明确报错,不静默回落到 P1。 |
| get_comment_imagesA | 评论区图片:阈值判读 → 并行下载 → 拼成带编号的联系表,返回格号清单。 top_n=0 时按阈值自动:图片占总赞 ≥15% 下 20 张,≥5% 下 10 张,低于 5% 直接跳过。 用法:先看联系表整版(一次视觉扫描,判断哪几格有信息量),再按 #编号回读原图。 数字与结论只认原图——缩略图只用于定位,不能作为引用依据(长图尤其)。 |
| transcribe_audioA | 没有字幕时的第三条路:下载音轨 → 本地 ASR 自建转写。 什么时候用
⚠️ 判「有没有字幕」必须带登录态:未登录时 B站返回空字幕列表, 看起来像"没字幕"(实测 6 个视频 + 195 个分P 全部返回空列表)。 转写引擎是使用者自备的(模型体积大,不进仓库)。
两种接法:
① pip install faster-whisper(首次会下模型,large-v3 约 3 GB)
② 设 BIG_ASR_CMD 指向你已有的转写命令(含 {audio} {out} 占位符)
两个都没有时,本工具返回 返回结构与 page:多 P 视频转写第几部分(默认 1)。这个参数以前是假的—— 签名里收了 page 但实现里写死读 P1。现在按 page 取对应的 cid, 音轨缓存也按分P分目录(否则 P2 会复用 P1 的音轨,静默返回 P1 的转写)。 |
| grab_framesA | 按需抽帧:只在字幕出现「明显影响理解且无法纠正」的错误时用。 什么时候用字幕/口播里出现数字、专有名词、参数名,且这个错会改变结论—— 不是"可能读错",是"读错了我就没法下判断"。这时抽该时间点附近的一张 画面确认。数字以画面为准,不以逐字稿为准。 ⛔ 不要全片抽帧。 全片抽帧产出的是"我看过这个视频", 不是"我核对了这个数字"。先用判据筛,命中才抽。 quality:720 看画面结构够用;要读表格/榜单里的数字必须 1080 (实测 640×360 只能认出几个大字,格子里全是糊的)。 page:多 P 视频抽第几部分(默认 1)。视频流缓存按分P分目录, 否则抽 P2 会复用 P1 的视频流,抽出来的画面根本不是那一段。 需要 ffmpeg。没装时返回明确指引,不静默失败。 返回 {sheet, grid[]}:grid 里每项含 #编号 / sec / ts / file, 按编号回读原图取数字(联系表只用于定位)。 |
| deep_readA | 一次调用聚合多条通道:字幕 + 评论 + 弹幕 + 封面(可选抽帧)。 为什么要有它本项目有 5 条取数通道,但每条要单独一次调用:Agent 要自己编排、 每次都要重新拼参数、而且每条通道都要先拉一次视频元数据。 DSH 那边的实现把多路整合成"一次看懂"(字幕/弹幕/热评/封面/抽帧)。 本工具是同构的等价物:少几轮往返,且一次拿到各通道的统一降级信号。 channels(默认 ["transcript","comments","danmaku","cover"]):
transcript 字幕(受 transcript_query / transcript_head_ratio / transcript_max_chars 控制)
comments 评论(受 comment_n / comment_detail 控制)
danmaku 弹幕(密度与披露线索)
cover 封面 URL(批次 C3 放回来的 返回: ⚠️ 成本:一次调用可能打多次上游( |
| get_creator_contentA | UP 主通道:档案 / 投稿列表 / 合集 / 系列 / 动态。 为什么需要这条通道议题收敛到 2–3 个核心 UP 之后,"这个 UP 后续又发了什么"是自然的下一步追问。
本项目原来没有这个能力——只能反复 section: "overview" UP 档案(昵称/签名/等级/粉丝数/认证) "videos" 投稿列表(按 order 排序,order 可选 pubdate / click / dm) "collections" 合集(season) "series" 系列(series) "dynamics" 动态流(最近发的动态,含视频引用) ⚠️ 端点可用性(2026-10-21 本机实测):space 系列端点必须带 WBI 签名,
不带就是 -799「请求过于频繁」。合集/系列的正确路径是
|
| scan_untrusted_textA | 注入检测(批次 C6 · 信任边界第二层):扫描任意外部文本。 为什么要有这个工具前面所有通道的注入检测都发生在取数时。但有时文本不是从本项目取来的:
⚠️ 命中不等于"这条在攻击 Agent":本检测是纯关键词匹配, 只能当"值得再看一眼"的提示,不能当证据。真正的判断要人/Agent 看原文。 误报是真实存在的(2026-10-21 实测:一条洛谷体长评因为「忽视」与「之前」 相隔很远而被独立匹配到一起,现已改成邻近匹配)。 返回:{n, flagged: [{index, risk, reasons, preview}], n_flagged, degraded} |
| registry_getA | 读资产库。每次任务开始前先查一遍——已有评级的 UP 主直接沿用。 kind:
"stats" 总览(条数、评级分布、评级变动、议题分布、经验库体积、议题档案数、
上一轮开销、报告库概览)
"source" 按 mid 查单个 UP 主(需 mid)
"video" 按 bvid 查单条视频(需 bvid,返回历史 key_findings,避免重复分析)
"sources" 列表(可按 domain 过滤)
"videos" 列表(可按 topic 过滤)
"insights" 读经验沉淀(跨议题的领域/信源/方法认知)。给了 topic 就只看该议题
"topic" 读议题档案(需 topic 名):核心问题/已搜方向/已覆盖/缺口/未收敛冲突/
用户采纳了什么/下次从哪切入——跨任务记忆与反馈闭环的落点
"topics" 列出全部议题档案
"protocol" 读检索协议(需 topic 名):阶段 0 的产物落盘,
报告 §五「检索范围与偏差声明」从这里读出来,不手写
"protocols" 列出全部已落盘的协议
"clusters" 读某议题的观点簇(需 topic):归簇结果落盘,供复核
"staging" 看暂存区里有什么(写侧闸门:commit 之前正式库不会被改动)
"cost" 调用账本汇总。 ⚠️ |
| registry_upsertA | 写资产库。每次任务结束必须调用,否则"资产积累"是空话。 kind="source":{mid, name, domains[], grade(A–F), grade_basis, notes}
grade_basis 必须写依据,不写就等于没评级——半年后看到"A"也想不起为什么。
重复写入且评级变了,工具会自动追加一条 conflicts 记录。
kind="video":{bvid, title, mid, topics[], grade(如 A1/D4), redundancy(原创/冗余/冲突),
key_findings[], transcript_pulled(bool), verdict}
verdict 是一句话定性:这条在议题里是什么角色。
kind="insight":{section: "领域"|"信源"|"方法", text},需要同时给 topic。
这是"越用越好用"的真正来源:不是又一份报告,而是下次能直接用的判断。
写入标准只有一个——它对下一个议题有用吗?不会帮忙的就别写。
范例:
领域:「B站财经区的收益预期普遍锚在 8–10%,任何'提前退休'测算先查这个锚」
信源:「某 UP 的数据都是二手转述,引用前必须找他引的原报告」
方法:「热点词族会带入大量番剧分集,40 条候选里 12 条无效,需在阶段 0 预判」
kind="topic":{topic, core_questions[], searched_axes[], covered[], gaps[],
open_conflicts[], user_adopted[], next_entry}
议题档案——跨任务记忆 + 反馈闭环。 🔴 写侧闸门(批次 C1):上面所有 kind 默认只进暂存区
( ⚠️ 写入边界会做入参归一化:MCP 客户端层实测会把记录里的数组压成
⚠️ kind="insight" 会做指令注入拦截:命中注入特征的条目被拒写,
并在返回的 |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 14 tools
Most tools target clearly distinct resources (comments, transcript, danmaku, frames, creator content, registry, injection scan). The main overlap is deep_read acting as an aggregator over the single-channel tools (get_transcript, get_comments, get_danmaku, grab_frames), and search_videos vs scan_topic both retrieving candidate videos. Descriptions clarify intended use, so confusion is limited but still possible.
All tool names use consistent snake_case verb_noun patterns (get_comments, search_videos, scan_topic, registry_upsert, transcribe_audio, grab_frames, etc.). No mixed casing or radically different naming styles. The pattern is predictable throughout.
14 tools is well within the ideal 3-15 range for this domain. Each tool covers a distinct data channel or registry operation, and the set does not feel bloated. The count supports the multi-channel investigation workflow without excessive surface area.
The surface covers the core Bilibili info-gathering lifecycle: search, metadata, transcript, comments, danmaku, frames, comment images, audio transcription, creator content, registry read/write/commit/discard, topic scanning, and injection detection. Minor gaps exist, such as no direct creator/user search or dedicated deletion of individual registry entries, but agents can work around these. Overall the tool set is comprehensive for its stated purpose.