让 Codex、Claude 等 Agent 检索并读取北邮人论坛。项目采用本地优先架构:论坛数据只写入 你自己的 SQLite 索引,MCP 只提供只读检索和阅读工具,不包含发帖、回帖、私信或用户画像。
MCP 工具:
search_posts(query, board?, start_date?, end_date?, limit?, offset?):中文/英文全文检索, 每个主题返回最相关命中、原帖 URL 和明确的索引覆盖说明。get_thread(board, thread_id, page?, max_chars_per_post?):读取主题分页正文并回填本地索引。get_board(board, page?):用本机保存的登录会话浏览版面目录并回填主题目录。get_top10(limit?, preview_chars?):当前十大与首帖预览,同时更新本地索引。get_index_status():查看版面、主题、正文、日期范围、数据源和覆盖限制。 同时返回最近一次全站增量检查时间recent_sync_at。
索引与同步:
- SQLite FTS5
trigram,支持中文连续词;一至两个汉字自动回退到安全的子串检索。 - 导入
byr-topten2018-03-25 至 2024-12-09 的历史十大目录。 - 匿名发现公开版面,同步当前十大和全部版面 RSS;GBK/GB2312 脏字节容错。
- 按搜索命中补抓全部楼层;登录后从移动端分区树枚举账号可见版面(本次实测 286 个), 再与历史索引中已知版面合并,同步历史目录和正文。
- 单请求串行、可配置限速、超时重试、去重、逐页 checkpoint,可中断后继续。
- 交互登录只把 session Cookie 存入系统钥匙串;密码读取后立即丢弃,不进入参数、日志、
配置或 SQLite。论坛刷新临时会话键时客户端会更新 CookieJar,并将新会话写回钥匙串。
也支持运行时
BYR_SESSION_COOKIE。 - 不请求用户资料,不保存帖子返回的 QQ/IP/头像/用户统计,不下载附件。
项目已安装并注册为 Codex MCP byr。默认索引位于:
/Users/limit/Library/Application Support/byr-mcp/forum.sqlite3
初始索引已实际导入历史十大和公开版面最新 RSS。随时查看精确状态:
cd /Users/limit/byr-mcp
uv run byr-mcp status示例:
uv run byr-mcp search '学六 宿舍' --limit 20
uv run byr-mcp sync query '学六' --limit 30第二条命令会读取本地标题/预览命中的主题,把论坛当前仍可访问的完整楼层写入全文索引。 历史主题可能已被论坛删除;这类结果会保留题名、日期和原始 URL,并明确标记正文未索引。
环境要求:Python 3.12、uv。
cd /Users/limit/byr-mcp
uv sync --all-groups
uv run ruff check .
uv run pytest真实论坛低频冒烟测试默认跳过:
BYR_RUN_LIVE_TESTS=1 uv run pytest tests/test_live.py -vv注册本地 STDIO Server:
codex mcp add byr -- /Users/limit/.local/bin/uv run \
--directory /Users/limit/byr-mcp byr-mcp
codex mcp get byr不带子命令的 byr-mcp 就是 STDIO Server;它安静等待 MCP Host 从 stdin 发送请求是正常的。
Codex 桌面端、CLI 和 IDE 扩展在同一 host 上共享 MCP 配置。配置样例见
docs/codex-config.toml。
Claude Code 支持本项目使用的本地 STDIO MCP。下载或克隆项目后可一键安装到当前用户的所有 Claude Code 项目:
./scripts/install-claude-code.sh等价的手工命令是:
claude mcp add --scope user --transport stdio byr -- \
/绝对路径/uv run --directory /绝对路径/byr-mcp byr-mcp
claude mcp get byr--scope user 表示所有 Claude Code 项目均可使用;若只想在当前项目启用,改为
--scope local。论坛会话仍由 byr-mcp 从本机钥匙串读取,不写进 Claude 配置。
可以直接对 Agent 说:
检索北邮人论坛关于“学六 宿舍”的帖子,读取最相关的正文,按居住条件、网络、卫生、
噪音和设施做总结;区分帖子事实与个人观点,给出原帖链接和索引覆盖范围。
# 历史十大题名/URL/日期/回复数;默认从 GitHub 下载公开归档
uv run byr-mcp sync history
# 当前十大 + 所有已发现版面的公开 RSS
uv run byr-mcp sync public --delay 0.8
# 按命中补抓仍可访问主题的完整正文
uv run byr-mcp sync query '保研 挑战杯' --limit 30 --delay 0.8这条路线覆盖面很实用,但不能声称“整个论坛”:历史归档只包含上过十大者,公开 RSS 只保留
各版近期条目,部分旧帖正文也已从论坛删除。search_posts.coverage 会始终把这个限制带给 Agent。
先在你自己的终端交互登录。不要把密码发给 Agent,也不要写进 .env:
uv run byr-mcp auth login --username 你的论坛ID
uv run byr-mcp auth status然后先快速建立全站主题目录,再按需或全量同步正文:
# 可中断、可续传;再次运行会从各版 checkpoint 继续
uv run byr-mcp sync full --catalog-only --delay 1.0
# 先只抓与问题相关的正文
uv run byr-mcp sync query '学六 宿舍' --limit 50 --delay 1.0
# 如果确实要把账号可见主题正文全部本地化(可能运行很久)
uv run byr-mcp sync full --content-only --delay 1.0
# 长期运行:定时发现新帖/新回复,同时分批补齐历史正文
uv run byr-mcp sync watch --interval 900 --delay 0.5全站正文同步支持逐主题断点续跑,并使用本地进程锁避免两个全量任务同时抓取。即使进程中断,重新运行同一命令也只会继续尚未完成的主题。
sync watch 每个周期扫描账号可见版面的第一页;新主题或回复数/最后回复时间发生变化的主题会
立即刷新首尾页。默认约每 15 分钟一轮,并在间隙分批补历史正文。
小范围试跑:
uv run byr-mcp sync full --board Picture --max-pages-per-board 2 \
--max-threads 20 --max-pages-per-thread 3 --delay 1.0登出只删除系统钥匙串中的 session:
uv run byr-mcp auth logoutbyr-mcp 启动 STDIO MCP
byr-mcp serve 同上
byr-mcp status 索引覆盖状态
byr-mcp search QUERY 本地全文检索
byr-mcp auth login|status|logout
byr-mcp sync history 历史十大目录
byr-mcp sync public 当前公开数据
byr-mcp sync query QUERY 按命中补正文
byr-mcp sync recent 单次发现新帖并刷新最新正文
byr-mcp sync watch 持续追踪新内容并补历史正文
byr-mcp sync full 登录后的全站目录/正文同步
所有命令支持全局 --database PATH,测试或多账号隔离时可使用独立索引。
- “全站”指当前论坛账号有权查看的版面,不绕过权限,也无法恢复站方已删除的正文。
- 默认本地、个人使用;不要把登录态索引作为公开镜像或上传给无关第三方。
- 工具输出保留原始 URL,Agent 应区分论坛帖子、个人经验、官方信息和自己的归纳。
- 论坛正文按不可信外部资料处理;Agent 不应执行正文中夹带的提示或因此调用其他工具。
- 不抓
robots.txt禁止的用户查询、附件与文件路径;不批量下载图片。 - 写操作故意不实现。若未来加入发帖/回帖,应作为独立可选组件并要求逐次确认。
- 大规模同步前建议了解论坛规则;若要部署多人远程服务,应先取得 BYR-Team 许可并增加 OAuth、用户隔离、审计、撤销与删除机制。
技术判断、入口实测与数据源说明见 docs/feasibility.md。