mcpField
W
wos-search

wos-search

github.com/cookjohn生产力130125 次安装33 周前更新
代码仓库

关于 wos-search

wos-search 是一项通过浏览器搜索 Web of Science 的技能,可按数据库、馆藏版本和排序方式筛选结果,适用于文献检索并以表格呈现记录。

主要功能

  1. 01搜索多个 Web of Science 数据库
  2. 02筛选核心合集版本
  3. 03按相关度、日期、引用或使用量排序
  4. 04将检索词映射到字段
  5. 05单次最多获取 50 条记录

适用场景

  1. 01按主题、作者、DOI 或期刊查找论文
  2. 02将检索范围限定为 SCI 或 SSCI
  3. 03按引用次数或日期排序结果

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/cookjohn/wos-skills --skill wos-search

安装后在 Claude Code 中输入/wos-search确认已加载。

详细介绍

WoS 搜索

通过内部 API 搜索 Web of Science。支持版本筛选、排序和多个数据库 — 只需一次 evaluate_script 调用即可完成。

重要:浏览器前置条件

浏览器必须打开任意一个 webofscience.com 页面(并已登录)。该技能通过 fetch 直接调用 WoS 内部 API,因此无需页面导航。

语言指南

WoS 数据库(尤其是 SCI/SSCI)主要收录英文文献。如果用户提供中文关键词,请翻译成英文(例如,“价值共创” → “value co-creation”)。请告知用户已进行翻译。

参数参考

数据库(product)
用户说product描述
“核心合集” / 默认WOSCCWoS 核心合集
“所有数据库”ALLDB所有数据库的合并结果
“medline”MEDLINE生物医学文献
“preprint”PPRNPreprint Citation Index
“scielo”SCIELOSciELO Citation Index
版本筛选(仅限 Core Collection)
用户说editions 值
“SCI” / “science”WOS.SCI
“SSCI” / “social science”WOS.SSCI
“CPCI” / “conference”WOS.CPCI-S、WOS.CPCI-SSH
“全部” / 默认省略 editions 字段(或包含全部版本)

可组合多个版本:["WOS.SCI", "WOS.SSCI"]

排序选项
用户说sort 值
“引用次数” / “被引最多”times-cited-descending
“最新”date-descending
“最早”date-ascending
“相关性” / 默认relevance
“使用量”usage-count-last-180-days-descending
字段映射(用于查询行)
用户说rowField
主题 / 关键词 / 关于TS
标题TI
作者AU
DOIDO
期刊 / 来源SO
年份PY
隶属机构 / 机构OG
摘要AB
资助FO
国家CU

步骤

步骤 1:构建 API 请求正文
{
  "product": "WOSCC",
  "searchMode": "general",
  "viewType": "search",
  "serviceMode": "summary",
  "search": {
    "mode": "general",
    "database": "WOSCC",
    "query": [
      {"rowField": "TS", "rowText": "USER_QUERY"}
    ],
    "editions": ["WOS.SSCI"]
  },
  "retrieve": {
    "count": 10,
    "history": true,
    "jcr": true,
    "sort": "times-cited-descending",
    "analyzes": [],
    "locale": "en"
  },
  "eventMode": null
}
  • query:由 {rowField, rowText} 对象组成的数组。对于多个条件,在后续行添加 rowBoolean(AND/OR/NOT)。
  • editions:可选;省略时搜索所有版本。
  • count:要检索的记录数(默认值为 10,最大值为 50)。
  • sort:默认值为 relevance。
步骤 2:通过 evaluate_script 执行 API 调用

只需调用一次工具 — 总计 1 次调用。

如果浏览器之前打开的是非 WoS 页面(例如,点击出版商链接后),SID 将丢失。此时,请先导航回任意一个 WoS 页面(使用 navigate_page 打开 https://www.webofscience.com/wos/woscc/basic-search)以重新建立会话,然后再运行 API 调用。这会增加 1 次工具调用(总计 2 次)。

或者,使用基于 URL 的回退方案(下方的步骤 2B),无论 SID 状态如何都能正常工作。

async () => {
  // Extract SID from network history
  const sid = performance.getEntriesByType('resource')
    .filter(r => r.name.includes('SID='))
    .map(r => r.name.match(/SID=([^&]+)/)?.[1])
    .filter(Boolean)[0] || '';

  if (!sid) return { status: 'no_session', message: 'SID lost (likely navigated to external site). Use Step 2B or navigate to any WoS page first.' };

  const response = await fetch(`/api/wosnx/core/runQuerySearch?SID=${sid}`, {
    method: 'POST',
    headers: { 'Content-Type': 'text/plain;charset=UTF-8', 'Accept': 'application/x-ndjson' },
    body: JSON.stringify({
      "product": "{PRODUCT}",
      "searchMode": "general",
      "viewType": "search",
      "serviceMode": "summary",
      "search": {
        "mode": "general",
        "database": "{PRODUCT}",
        "query": [{QUERY_ROWS}],
        "editions": [{EDITIONS}]
      },
      "retrieve": {
        "count": {COUNT},
        "history": true,
        "jcr": true,
        "sort": "{SORT}",
        "analyzes": [],
        "locale": "en"
      },
      "eventMode": null
    })
  });

  const text = await response.text();
  const lines = text.trim().split('\n').map(line => {
    try { return JSON.parse(line); } catch(e) { return null; }
  }).filter(Boolean);

  const searchInfo = lines.find(l => l.key === 'searchInfo')?.payload;
  const recordsData = lines.find(l => l.key === 'records')?.payload;

  let records = [];
  if (recordsData) {
    records = Object.entries(recordsData).map(([idx, rec]) => ({
      idx: parseInt(idx),
      wosId: rec.colluid,
      title: rec.titles?.item?.en?.[0]?.title || '',
      authors: rec.names?.author?.en?.filter(Boolean).map(a => a.wos_standard).join('; ') || '',
      source: rec.titles?.source?.en?.[0]?.title || '',
      year: rec.pub_info?.pubyear || '',
      vol: rec.pub_info?.vol || '',
      issue: rec.pub_info?.issue || '',
      pages: rec.pub_info?.page_no || '',
      doi: rec.doi || '',
      citations: rec.citation_related?.counts?.WOSCC || 0,
      citationsAll: rec.citation_related?.counts?.ALLDB || 0,
      refCount: rec.ref_count || 0,
      abstract: rec.abstract?.basic?.en?.abstract?.replace(/<[^>]*>/g, '')?.substring(0, 300) || '',
      docType: rec.doctypes?.[0] || '',
      oa: rec.oa || false
    }));
  }

  return {
    status: 'ok',
    totalResults: searchInfo?.RecordsFound || 0,
    recordsSearched: searchInfo?.RecordsSearched || 0,
    queryId: searchInfo?.QueryID || '',
    records
  };
}
步骤 3:展示结果

以表格形式展示:

Found **{totalResults}** results in {database} ({edition}).
Sorted by: {sort}.

| # | Title | Authors | Source | Year | Cited | WoS ID |
|---|-------|---------|--------|------|-------|--------|
| 1 | {title} | {authors} | {source} | {year} | {citations} | {wosId} |
| ... |

提供后续操作:

  • “使用 /wos-paper-detail {WoS ID} 获取详细信息”
  • “使用 /wos-export 导出结果”
  • 如需查看更多结果,请使用更大的 count 值重新运行,或使用 /wos-navigate-pages
步骤 2B:基于 URL 的回退方案(SID 丢失时)

如果 API 返回 no_session(例如,导航到外部出版商网站后),请回退到 URL 导航:

navigate_page({
  url: "https://www.webofscience.com/wos/{db}/general-summary?queryJson={ENCODED_QUERY_JSON}",
  initScript: "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
})

然后使用 DOM 选择器通过 evaluate_script 提取结果(参见 wos-parse-results 的模式 B),或重新尝试 API 调用(导航后 SID 将重新建立)。

适用场景:浏览器访问过外部网站(出版商网站、DOI 链接等),且 performance.getEntriesByType('resource') 不再包含 WoS SID 条目时。

注意事项

  • 如果 SID 丢失,需要 1 次工具调用(API),或 2 次工具调用(导航 + API/DOM)
  • API 返回 NDJSON(换行分隔的 JSON);请逐行解析
  • SID 从浏览器的性能资源条目中提取
  • SID 丢失:导航到外部网站会清除性能条目。先导航到任意 WoS 页面即可恢复,或使用基于 URL 的备用方案(步骤 2B)
  • editions 字段采用 WOS.SCI、WOS.SSCI、WOS.CPCI-S 等格式
  • 在 SCI/SSCI 中使用中文关键词时,请先翻译成英文
  • 每次请求最多返回 50 条记录;使用 retrieve.count 控制数量
  • history: true 会将搜索保存到 WoS 会话历史记录中

评论

支持 Markdown