Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
yuanyuanma03 avatar

Wos Navigate Pages

  • 19 installs
  • 45 repo stars
  • Updated June 23, 2026
  • yuanyuanma03/academic-research-skills

Load a specific page of Web of Science search results, either by editing the results URL or re-running the search API with an offset.

About

Paginates WoS results using a URL page number or a preferred single-call API re-run with a retrieve.first offset. A researcher uses it to load more or specific pages of a WoS search.

  • URL-based and API-based pagination approaches
  • API approach re-runs the search with a computed offset

Wos Navigate Pages by the numbers

  • 19 all-time installs (skills.sh)
  • Ranked #1,308 of 2,715 Automation & Workflows skills by installs in the Skillselion catalog
  • Data as of Aug 3, 2026 (Skillselion catalog sync)
npx skills add https://github.com/yuanyuanma03/academic-research-skills --skill wos-navigate-pages

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs19
repo stars45
Last updatedJune 23, 2026
Repositoryyuanyuanma03/academic-research-skills

What it does

Load a specific page of Web of Science search results, either by editing the results URL or re-running the search API with an offset.

Files

SKILL.mdMarkdownGitHub ↗

WoS Navigate Pages

Load a specific page of results from the current WoS search.

Steps

The two approaches below each count as one step.

Approach A: URL-based (when browser is on a results page)

The results URL follows the pattern:

/wos/woscc/summary/{session-uuid}/{sort}/{page-number}

Modify the page number in the URL and navigate. Then extract via evaluate_script with DOM selectors. Uses 2 tool calls.

Approach B: API-based (preferred, 1 tool call)

Re-run the search API with retrieve.first offset:

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

  const page = {TARGET_PAGE};  // 1-based
  const perPage = 50;
  const first = (page - 1) * perPage + 1;

  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": "WOSCC",
      "searchMode": "general",
      "viewType": "search",
      "serviceMode": "summary",
      "search": {
        "mode": "general",
        "database": "WOSCC",
        "query": [{SAME_QUERY_AS_ORIGINAL_SEARCH}],
        "editions": [{SAME_EDITIONS}]
      },
      "retrieve": {
        "first": first,
        "count": perPage,
        "history": false,
        "jcr": true,
        "sort": "{SAME_SORT}",
        "analyzes": [],
        "locale": "en"
      },
      "eventMode": null
    })
  });

  const text = await response.text();
  const lines = text.trim().split('\n').map(l => { try { return JSON.parse(l); } 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: first + parseInt(idx) - 1,
      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 || '',
      doi: rec.doi || '',
      citations: rec.citation_related?.counts?.WOSCC || 0
    }));
  }

  return { status: 'ok', page, totalResults: searchInfo?.RecordsFound || 0, records };
}

Notes

  • API approach uses 1 tool call only
  • Requires remembering the original search query/editions/sort from the prior wos-search call
  • retrieve.first is 1-based record offset (1 = first record, 51 = page 2, etc.)
  • 50 records per page, max 100,000 records accessible

Related skills

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.