From gs-navigate-pages
Navigate Google Scholar search result pages. Use when user wants to see more results or go to a specific page.
How this skill is triggered — by the user, by Claude, or both
Slash command
/gs-navigate-pages:gs-navigate-pages [next|previous|page N][next|previous|page N]The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Navigate search result pages. Requires context from a previous gs-search or gs-advanced-search call.
Navigate search result pages. Requires context from a previous gs-search or gs-advanced-search call.
$ARGUMENTS can be:
next — go to next pageprevious — go to previous pagepage N — go to page NThis skill requires context from a previous search:
currentUrl: the current Google Scholar search URLpage: current page number (1-based)Google Scholar uses start parameter for pagination (0-indexed, increments of 10):
start=0 (or omitted)start=10start=20Based on $ARGUMENTS:
next: newStart = currentStart + 10previous: newStart = max(0, currentStart - 10)page N: newStart = (N - 1) * 10Modify the start parameter in the current search URL. If start doesn't exist in the URL, append &start={newStart}.
Use mcp__chrome-devtools__navigate_page with the updated URL.
Same extraction script as gs-search step 2:
async () => {
for (let i = 0; i < 20; i++) {
if (document.querySelector('#gs_res_ccl') || document.querySelector('#gs_captcha_ccl')) break;
await new Promise(r => setTimeout(r, 500));
}
if (document.querySelector('#gs_captcha_ccl') || document.body.innerText.includes('unusual traffic')) {
return { error: 'captcha', message: 'Google Scholar requires CAPTCHA verification. Please complete it in your browser, then tell me to continue.' };
}
const items = document.querySelectorAll('#gs_res_ccl .gs_r.gs_or.gs_scl');
const results = Array.from(items).map((item, i) => {
const titleEl = item.querySelector('.gs_rt a');
const meta = item.querySelector('.gs_a')?.textContent || '';
const parts = meta.split(' - ');
const authors = parts[0]?.trim() || '';
const journalYear = parts[1]?.trim() || '';
const citedByEl = item.querySelector('.gs_fl a[href*="cites"]');
return {
n: NEW_START + i + 1,
title: titleEl?.textContent?.trim() || item.querySelector('.gs_rt')?.textContent?.trim() || '',
href: titleEl?.href || '',
authors,
journalYear,
citedBy: citedByEl?.textContent?.match(/\d+/)?.[0] || '0',
citedByUrl: citedByEl?.href || '',
dataCid: item.getAttribute('data-cid') || '',
fullTextUrl: (item.querySelector('.gs_ggs a') || item.querySelector('.gs_or_ggsm a'))?.href || '',
snippet: item.querySelector('.gs_rs')?.textContent?.trim()?.substring(0, 200) || ''
};
});
const totalText = document.querySelector('#gs_ab_md')?.textContent?.trim() || '';
const hasNext = !!document.querySelector('#gs_n a.gs_ico_nav_next, #gs_nm a:last-child');
const currentUrl = window.location.href;
return { total: totalText, page: NEW_PAGE, resultCount: results.length, hasNext, currentUrl, results };
}
Replace NEW_START and NEW_PAGE with the computed values.
Page {page} for "{query}" ({total}):
1. {title}
Authors: {authors} | {journalYear}
Cited by: {citedBy}
Data-CID: {dataCid}
2. ...
{hasNext ? "More results available — ask me for the next page." : "No more results."}
navigate_page + evaluate_scriptstart parameter controls pagination offsetCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub yuanyuanma03/academic-research-skills --plugin gs-navigate-pages