Skip to content
alyn
cookjohn

Gs Search skill

Search Google Scholar for academic papers by keywords. Returns results with title, authors, journal, year, citation count, and full-text links. Use when the user wants to search Google Scholar.

$npx skills add cookjohn/gs-skills --skill gs-search
View this skill on GitHubcookjohn/gs-skills/skills/gs-search/SKILL.md
Pack stars
545
Pack installs
1.5k
Alyn Score
40/99
Updated
8 months ago
License
MIT
– views – installs via Alyn

Install Gs Search

Pick your agent. Every command is ready to paste.

$npx skills add cookjohn/gs-skills --skill gs-search

The open skills CLI detects your agents (Claude Code, Cursor, Codex and 70+ more) and installs to the right folder. Add -g to install globally.

01

Install it

Run the command above, or upload the folder in Claude.

02

Ask naturally

Describe the task. Your agent loads gs-search when the request matches its description.

03

Name it if needed

If it does not trigger, say “use the gs-search skill”. In Codex, type $gs-search.

The skill itself

SKILL.md

FolderGitHub

Search Google Scholar for papers using keyword(s). Returns structured result list via DOM scraping.

Arguments

$ARGUMENTS contains the search keyword(s).

Steps

1. Navigate

Use mcp__chrome-devtools__navigate_page:

  • url: https://scholar.google.com/scholar?q={URL_ENCODED_KEYWORDS}&hl=en&num=10

2. Extract results (evaluate_script)

Wait for results to load, check for CAPTCHA, then scrape the DOM:

async () => {
  // Wait for results or CAPTCHA
  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));
  }

  // CAPTCHA check
  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 || '';
    // Parse "Author1, Author2 - Journal, Year - publisher"
    const parts = meta.split(' - ');
    const authors = parts[0]?.trim() || '';
    const journalYear = parts[1]?.trim() || '';
    const citedByEl = item.querySelector('.gs_fl a[href*="cites"]');
    const relatedEl = item.querySelector('.gs_fl a[href*="related"]');
    const versionsEl = item.querySelector('.gs_fl a[href*="cluster"]');

    return {
      n: 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) || '',
      relatedUrl: relatedEl?.href || '',
      versionsUrl: versionsEl?.href || '',
      versions: versionsEl?.textContent?.match(/\d+/)?.[0] || ''
    };
  });

  const totalText = document.querySelector('#gs_ab_md')?.textContent?.trim() || '';
  const currentUrl = window.location.href;
  return { total: totalText, resultCount: results.length, currentUrl, results };
}

3. Report

Present results as a numbered list:

Searched Google Scholar for "$ARGUMENTS": {total}

1. {title}
   Authors: {authors} | {journalYear}
   Cited by: {citedBy} | [Full text]({fullTextUrl})
   Data-CID: {dataCid}

2. ...

Always show the dataCid — it's the unique identifier used for citation export and "cited by" tracking.

If fullTextUrl is available, highlight it (means open-access PDF/HTML).

4. Follow-up

When the user wants to:

  • See more results: use gs-navigate-pages to go to next page
  • See who cited a paper: use gs-cited-by with the data-cid
  • Export to Zotero: use gs-export with the data-cid(s)

CAPTCHA Handling

If the result contains {error: 'captcha'}:

  1. Tell the user: "Google Scholar is requesting CAPTCHA verification. Please complete it in your browser."
  2. Wait for user confirmation
  3. Retry the evaluate_script extraction

Notes

  • This skill uses 2 tool calls: navigate_page + evaluate_script
  • Google Scholar has NO public API — all data extraction is via DOM scraping
  • data-cid is the primary identifier (cluster ID) — used across all GS skills
  • Keep request frequency low to avoid triggering CAPTCHA
  • Default num=10 results per page (max 20)

Tips for Gs Search

  • • Start a fresh session after installing so your agent picks up the new skill.
  • • It is part of a pack with 6 skills. Install only the ones you need with --skill to keep triggers precise.
  • • If two skills overlap, mention the one you want by name.

Questions about Gs Search

What does the Gs Search skill do?

Search Google Scholar for academic papers by keywords. Returns results with title, authors, journal, year, citation count, and full-text links. Use when the user wants to search Google Scholar.

How do I install Gs Search?

Run "npx skills add cookjohn/gs-skills --skill gs-search" in your project. The skills CLI installs it for Claude Code, Cursor, Codex and 70+ other agents. In Claude on the web, upload the skill folder as a ZIP under Customize > Skills.

Does Gs Search work in Cursor and Codex?

Yes. Gs Search uses the open SKILL.md format, so it works in Claude Code, Claude, Cursor, OpenAI Codex, Gemini CLI, GitHub Copilot and other agents that support agent skills.

Is Gs Search free?

Gs Search is open source on GitHub under the MIT license. It is free to install; check the license before commercial use.

Who made Gs Search?

Gs Search is published by cookjohn in the cookjohn/gs-skills repository, together with 5 other skills.

Similar skills. From other creators.