Skip to main content
Glama
Vita0818

CC98-SearchPro

by Vita0818

CC98-SearchPro

面向“找讨论 → 判断相关性 → 阅读上下文 → 引用证据”的独立只读 MCP 与 Codex 插件。支持校园网或已有 VPN 直连。

下载发行包 · 版本记录 · 隐私说明

搜索能力

  • 多路召回:完整关键词优先,结合中文分词和有限的查询变体补查;精确标题不足时参考相关标题中的高频片段。

  • 证据排序:标题完整短语、首帖正文完整短语、标题全词、正文全词、弱相关依次排列;反馈词只用于召回,不计作相关性证据。

  • 正文核对与摘要:按预算读取候选首帖,返回命中片段、验证状态、主题与楼层编号。

  • 版面与日期筛选:版内查询使用 CC98 的版内搜索接口;日期在已召回候选中按发帖时间筛选,支持相关性、最新、阅读数排序。

  • 可续读:搜索快照分页不重复发请求;帖子按楼层读取,单楼长正文可按字符位置继续,支持原始 UBB/Markdown。

  • 有限请求:请求串行且至少间隔 400 ms;搜索 403 或 API 429 冷却后最多重试一次;持续失败保留已有结果。

插件不含发帖、回帖、私信、点赞等写工具,不调用大模型 API,不需要任何 AI 供应商密钥。

Related MCP server: panopticon

安装

需要 Node.js 22.18+,交互登录脚本需要 Python 3。仓库与发行包包含内置依赖的 runtime/,使用时无需 npm 安装或编译。

从 GitHub 安装到 Codex

codex plugin marketplace add Vita0818/CC98-SearchPro --ref v0.1.0
codex plugin add cc98-searchpro@cc98-searchpro

安装后打开新聊天,使用 CC98-SearchPro 检查登录状态。状态工具会返回当前安装位置的 setup_command,在本机终端运行它即可隐藏输入 CC98 账号密码。

仓库插件市场遵循 Codex 官方插件分发格式,位于 .agents/plugins/marketplace.json。这里提供的是 GitHub 仓库分发,不是官方公共插件目录上架。

下载 ZIP 或克隆源码

将 Release 中的 ZIP 解压到用户主目录下,或克隆仓库:

git clone https://github.com/Vita0818/CC98-SearchPro.git
cd CC98-SearchPro
python3 scripts/login.py
node runtime/cli.mjs status --check
python3 scripts/install-local.py --apply

安装器会注册现有目录并保留个人市场中的其他条目;安装后请保留该目录。同名插件指向其他目录时会停止,不覆盖原条目。只预览安装位置时省略 --apply。

登录与本地数据

在插件目录也可以使用 npm 命令配置和检查登录,无需先安装 npm 依赖:

npm run configure
npm run status

configure 在本机终端隐藏输入 CC98 密码,只通过子进程标准输入传给登录程序。密码不保存、不进入命令参数;新安装的会话令牌保存在 ~/.local/share/cc98-searchpro/session.json(文件权限 0600)。设置 CC98_SEARCHPRO_DATA_DIR 可选择独立数据目录;兼容旧变量 CC98_SEARCH_DATA_DIR,未设置时也遵循 XDG_DATA_HOME。如果开发版目录 cc98-search-mcp 中已有会话而新目录尚无会话,会继续使用原会话。令牌过期自动刷新,刷新被拒绝后提示重新登录,不自动重试密码。

已持有会话 JSON 时可以导入(不把令牌粘进聊天):

node runtime/cli.mjs import-session < /path/to/session.json
npm run status

支持 access_token / accessToken、refresh_token / refreshToken,以及桌面端 expires_at(Unix 秒)、expires_at_ms 或网页 accessToken_expirationTime。兼容网页的 str- 包装和 Bearer 前缀。导入会为本插件创建独立副本,不会自动读取或修改其他客户端的会话;不同客户端共享刷新令牌可能受服务端令牌轮换影响,独立登录更稳定。

删除本插件会话:node runtime/cli.mjs logout。

通用 stdio MCP

将以下配置中的路径替换为实际目录,可供支持 stdio MCP 的客户端使用:

{
  "mcpServers": {
    "cc98-searchpro": {
      "command": "node",
      "args": ["/absolute/path/CC98-SearchPro/runtime/server.mjs"]
    }
  }
}

五个工具

工具

用途

cc98_status

检查配置;check=true 读取当前账号验证连接

cc98_find_boards

按名称查找版面编号,支持分页

cc98_search

多路搜索、去重排序、正文验证,产生搜索快照

cc98_search_results

通过 search_id、offset 翻阅已有候选

cc98_read_topic

阅读主题与楼层,用 next 继续长正文或后续楼层

示例搜索参数:

{
  "keyword": "保研经验",
  "terms": ["保研", "经验"],
  "depth": "balanced",
  "created_after": "2025-01-01",
  "sort": "relevance",
  "limit": 10
}

terms 可省略,由本地分词生成。日期均为北京时间,created_before 包含指定日期全天;上游时间缺少时区时不猜测,日期筛选会跳过并计入 unknown_dates。limit 只控制结果每页数量。

阅读工具接受含页码和楼层锚点的链接,例如 /topic/42/3#7 从第 27 楼开始;显式传 from 时以该偏移为准。引用链接按论坛每页 10 楼的规则生成。

深度

原词最多页数

首帖验证上限

业务 API 调用上限

单次搜索时间上限

quick

1

5

10

12 秒

balanced(默认)

2

12

20

25 秒

deep

3

24

32

45 秒

每个补查词只取一页,每页请求 20 条;最多 3 个初始补查词和 2 个标题反馈词。调用统计按业务 GET 计数,不含令牌刷新及每次 GET 的有限重试。达到时间、请求预算或发生错误时返回 partial 和 stop_reason。

相同参数的完整搜索两分钟内复用快照,refresh=true 强制重新搜索。快照仅驻留内存,最多 20 份、15 分钟有效;翻页不会扩大召回范围。服务重启、登录切换或退出会使对应快照失效。多客户端使用时各自保有搜索快照。

覆盖范围与验证

官方主题索引决定候选范围,插件再对候选首帖做正文验证。它不是全站全文索引,不能保证召回正文命中但标题索引完全未召回的帖子,也不搜索全部回复、图片或附件。coverage.exhaustive 始终为 false,total_candidates 只是本次筛选后候选数量;complete 表示本次设定范围的执行完成,不表示搜索了整个论坛。

match 与 first_post_verification 分开返回:标题可以精确匹配而正文尚未读取;正文不可访问不会伪装成已验证。日期筛选和排序作用于已召回候选,因此“按最新”不是服务端完整的最新匹配列表。

离线测试使用模拟 CC98 响应。2026-10-22 已使用构建后的插件直连公开版面接口,读取到 12 个分区、267 个版面;账号登录、搜索和受限帖阅读尚未完成真实账号联调。真实验收先运行 npm run status,再用自己知道标题和正文的帖子测试搜索、版内限制、引用楼层和翻页。

开发与打包

npm ci --ignore-scripts
npm run check           # 类型、行为、安装器、构建与独立运行测试
npm run release:package # 在 release/v0.1.0/ 生成 ZIP、npm tgz 与 SHA256SUMS

src/ 为源代码,dist/ 为普通编译输出,runtime/ 为包含运行依赖的发布文件。后者随仓库提交,支持 Git 插件市场安装。npm-shrinkwrap.json 锁定构建与运行依赖,runtime/THIRD_PARTY_LICENSES.txt 保留被打包依赖的许可文本。发布包不包含账号会话、环境文件、npm 缓存或 node_modules。

实现来源

查询变体、标题反馈与匹配策略基于 CC98-SearchPlus 适配;UBB 解析来自本地 cc98-desktop 项目。登录、请求队列、搜索编排、快照、长帖阅读与 MCP 工具独立实现。详情见 THIRD_PARTY_NOTICES.md。

Available Tools

5 tools
cc98_find_boards查找 CC98 版面B
Read-onlyIdempotent

按名称或分区查找版面 ID,供版内搜索使用;空关键词列出全部,按 next_offset 翻页。

NameRequiredDescriptionDefault
limitNo
offsetNo
keywordNo

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent and non-destructive, so the safety profile is covered. The description adds genuinely new behavior: empty keyword returns everything and paging is driven by next_offset. It does not say whether next_offset comes from the response or how many results a page yields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single compact sentence with the lookup purpose front-loaded and the empty-keyword and paging rules appended. No filler, though the semicolon-dense packing makes the paging clause slightly easy to miss.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Three optional parameters and no output schema; the description covers the lookup intent and one paging cursor but does not describe what a board record contains or confirm that next_offset is returned. Adequate, but a small gap remains for an agent trying to page correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains keyword (empty = list all) and offset-based paging via next_offset, but leaves limit (default 30, max 50) completely undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (查找) and resource (版面), plus the concrete output (版面 ID) and its downstream purpose (供版内搜索使用). This clearly separates it from the read/search siblings, though it never names them explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives one useful usage rule — an empty keyword lists all boards — and implies it should be called before board-scoped searching. There is no explicit guidance on when to prefer this over cc98_search or how it relates to the other search tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cc98_read_topic阅读 CC98 帖子A
Read-onlyIdempotent

读取主题和指定楼层,用于核对搜索证据。topic 接受编号或 CC98 链接,省略 from 时从链接所指位置开始;from 是从 0 开始的楼层列表偏移。按 next 续读,raw 保留原始 UBB/Markdown。

NameRequiredDescriptionDefault
fromNo
sizeNo
topicYes
formatNotext
content_offsetNo
max_charactersNo

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/openWorld/destructive=false, so safety is covered. The description adds real behavioral context: pagination via next, offset semantics, and raw-vs-rendered output. It still says nothing about default page size, limits, or return shape.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three compact sentences, front-loaded with what is read and why; the link/offset nuance and continuation cue follow logically. Slightly dense packing of offset semantics, but no wasted text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema and the description mentions a next field without explaining the return payload; it also leaves three of six input parameters unexplained. Adequate for a read tool but not complete given the 0% schema coverage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it explains only 3 of 6 parameters (topic accepts ID or link, from is a 0-based floor offset defaulting to the link position, format raw). size, content_offset, and max_characters remain completely undocumented in both schema and description, which matters for pagination.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (读取主题和指定楼层) and adds a disambiguating purpose (核对搜索证据) that separates it from the sibling search tools. It does not name sibling tools explicitly, but the intent is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Frames the tool as a follow-up to searching (用于核对搜索证据) and explains continuation via next, which is clear usage context. There is no explicit when-not-to-use or a direct pointer to cc98_search vs cc98_search_results.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cc98_search_results续读 CC98 搜索结果A
Read-onlyIdempotent

按 search_id 与 next_offset 读取已有候选;不再次搜索。快照 15 分钟内有效,服务重启或换账号后失效。

NameRequiredDescriptionDefault
limitNo
offsetNo
search_idYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, and the description adds genuinely useful behavior beyond them: the snapshot has a 15-minute TTL and dies on service restart or account switch. It stops short of saying what happens when the search_id is expired (empty list vs. error) and describes paging in terms of 'next_offset' that does not exist in the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with what is being read and the key constraint that no new search occurs. No filler, and the TTL caveat is placed where an agent will see it before calling.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only, idempotent continuation tool with no output schema, the description covers the essentials: source identity, no re-search, and the lifetime of the snapshot. It is still thin on return shape (what a 'candidate' looks like, total counts) and on limit behavior, but those are secondary for a pager.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must carry the parameter burden, but it covers only search_id's role and a continuation concept. It never mentions limit or its default of 10 / maximum of 20, and it calls the paging parameter 'next_offset' while the schema parameter is 'offset', which risks mis-invocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (读取/续读) and resource (已有候选/search results snapshot), and explicitly disclaims searching again, which separates it from the sibling cc98_search. An agent can tell it apart from cc98_search and cc98_read_topic without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly says this reads an existing search by search_id rather than performing a new search, and adds a 15-minute validity window plus invalidation on restart or account switch, which is real usage context. However it never explicitly names the prerequisite tool (cc98_search) that produces search_id, so the routing direction is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cc98_statusCC98 连接状态A
Read-onlyIdempotent

检查本地登录配置;check=true 时读取当前账号以验证直连和登录。

NameRequiredDescriptionDefault
checkNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnly/idempotent/non-destructive and openWorldHint, and the description adds the key detail: the default mode stays local, while check=true actually hits the network to read the current account. That clarifies the network-cost difference between modes, though it doesn't say what is reported on failure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single compact sentence with the primary behavior front-loaded and the flag semantics appended after the semicolon. Nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a diagnostic/status tool with no output schema, the description never hints at what is returned (login state, username, connection result, error shape). Safety is covered by annotations, but an agent can't anticipate the result payload from the text alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% (the check boolean has no description), so the description must carry the meaning. It explains exactly what true triggers — reading the current account to verify direct connection and login — which makes the parameter actionable; the false case is only implied by '检查本地登录配置'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action (检查本地登录配置) plus a second mode (读取当前账号以验证直连). This clearly distinguishes it from siblings like cc98_read_topic and cc98_search, which fetch content, though it never names them explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The conditional 'check=true 时' implies when to use each mode, but the description never states when to call this tool at all (e.g. before other cc98 tools, or after auth failures) nor any exclusions. Usage is inferable rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 5 tool updatesv0.1.0
    • First observedcc98_find_boards
    • First observedcc98_read_topic
    • First observedcc98_search
    • First observedcc98_search_results
    • First observedcc98_status

TDQS

A3.7/5.0

Scored across 5 tools

Disambiguation4/5

Each tool targets a distinct stage of the search workflow: board lookup, search execution, result pagination, topic reading, and auth status. The only potentially confusable pair is cc98_search vs cc98_search_results, but the descriptions clearly separate starting a new search from reading an existing snapshot by search_id.

Naming Consistency4/5

All tools use a consistent cc98_ snake_case prefix, which reads well as a set. Minor deviation: cc98_status and cc98_search_results are noun-oriented while the others begin with verbs, but the pattern remains predictable.

Tool Count5/5

Five tools is a tight, well-scoped surface for a search-and-retrieval server. Each tool maps to a necessary capability, with no filler or redundant operations.

Completeness4/5

The surface covers the core workflow end to end: find boards, run search, page results, read topics/floors for evidence, and verify auth. Minor gaps exist around richer filters or listing topics by board, but agents can work around them with the provided search flow.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to browse and search NGA forum posts, including browsing forum sections, viewing post details with replies, and searching posts by keyword.
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables assistants to directly query a large community archive, including user activity, thread development, and front-page history over decades. It provides read-only access to answer questions about who is most active and how the community has changed.
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables AI agents to locally index and read-only search the BYR BBS, including full-text post search, thread reading, board browsing, and index status checks.
    5
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables reading public Baidu Tieba content through a persistent real-browser session, supporting forum searches, post details, and user public post lists with optional login-state injection.
    -