Google Scholar Skills
Google Scholar Skills for Claude Code
Six skills and a gs-researcher agent: Claude Code searches Google Scholar, tracks citations, fetches full-text links and exports to Zotero
- 538 ★ on the repository
- Last commit
- MIT
Extended access
Why this level
- Debugging port 9222 gives the agent control of Chrome tabs, including ones where you are signed in
- The skill runs JavaScript on the page and downloads data, and gs-export passes records to Zotero
- The full-text links include Sci-Hub, whose lawfulness depends on your country
Install
- Works in
Manual install
claude mcp add chrome-devtools -- npx -y chrome-devtools-mcp@latestStep 1: the Chrome DevTools MCP server through which the skills drive the browser.
Access and checks
How we reviewExtended accessThe tool runs code or makes network calls and only reads external data.
- Debugging port 9222 gives the agent control of Chrome tabs, including ones where you are signed in
- The skill runs JavaScript on the page and downloads data, and gs-export passes records to Zotero
- The full-text links include Sci-Hub, whose lawfulness depends on your country
This is third-party code. Review the repository files before installing.
What it does
The set drives Google Scholar through Chrome DevTools MCP: the service has no public API, so the skills parse the page with CSS selectors. Each operation takes one or two tool calls, with no screenshot recognition. The gs-search skill searches by keywords and returns title, authors, journal, year, citation count and links. Gs-advanced-search adds filters for author, journal, date range, exact phrase and title-only, for example author:Einstein after:2020. Gs-cited-by finds works citing a chosen paper through its data-cid identifier, which serves as the key across all skills. Gs-fulltext collects links to the PDF, DOI and publisher page, and gs-navigate-pages pages through results. Gs-export takes BibTeX and sends the record to Zotero with the push_to_zotero.py script. The gs-researcher agent ties all six skills into chains like search, citations, export to Zotero. If Google shows a CAPTCHA, it stops and asks you to solve it by hand in the browser.
Who it is for. For researchers, graduate students and students who collect literature in Google Scholar and keep a library in Zotero.
Good fit when
- You want a structured list of papers on a topic with citation counts, journals and years
- You need papers by Einstein after 2020 or an exact phrase in titles only
- You want to see who cites a key paper and follow the citation chain
- You need full-text links: PDF, DOI, publisher page
- You want the papers you found pushed straight to Zotero as BibTeX
Not a fit when
- You need an official API with a guaranteed structure: page parsing can break when Google Scholar changes its markup
- You need Chinese databases: the catalog has a separate set for CNKI from the same author
- You want to search without a browser: Chrome has to be open with a debugging port
- You need bulk data collection: frequent requests trigger a CAPTCHA that the skill asks you to solve by hand
Example request
/gs-advanced-search author:Hinton after:2022 neural networks, then show who cites the first paperLimitations
Requires Chrome with remote debugging on port 9222 and the chrome-devtools-mcp server. Export needs the Zotero desktop app and Python 3. Data comes from page parsing, so a markup change can break it. Among other links, gs-fulltext returns Sci-Hub links; whether using them is lawful depends on your country and your organization's rules. A CAPTCHA pauses work until you solve it by hand.
How to disable. Delete the gs-* folders from .claude/skills and gs-researcher.md from .claude/agents. Remove the server with claude mcp remove chrome-devtools and close Chrome with the debugging port.
FAQ
How do I connect Google Scholar to Claude Code?
Install the server with claude mcp add chrome-devtools -- npx -y chrome-devtools-mcp@latest, copy the skills and agents folders from the repository into .claude and start Chrome with --remote-debugging-port=9222. After launching claude, check the setup with /gs-search deep learning.
Why don't the skills use a Google Scholar API?
The service has no public API. The skills read the page through evaluate_script and CSS selectors, and get BibTeX through navigate_page to sidestep CORS limits on scholar.googleusercontent.com.
What is data-cid and why does it matter?
It is the article's cluster ID in Google Scholar results. It is the primary key across all skills: citation tracking, export and cross-references run on it, for example /gs-cited-by 0qfs6zbVakoJ.
What does the skill do on a CAPTCHA?
It detects the CAPTCHA, stops and asks you to solve it in the browser, after which you tell it to continue. The skill never solves a CAPTCHA automatically.
Is Zotero required?
No. Zotero and Python 3 are needed only for export through gs-export. Search, citations and full-text links work without them.
Discussion
No questions or reviews yet.
Related
SkillsCNKI Skills
CNKI Skills for Claude Code
A Claude Code skill set that drives CNKI through Chrome DevTools MCP: search papers, browse journals, download PDFs and export to Zotero
A Claude Code skill that turns the agent into a researcher: multi-step source collection, citation verification, and a wiki report that grows session by session
Deep Research
Deep Research Skill for Claude Code
A deep research skill for Claude Code: multi-phase search, claim verification and cited reports in Markdown, HTML and PDF
Paper search across five databases with deduplication, citation checks and RIS or BibTeX export for Claude Code and Codex
An MCP server that searches Google and Scholar, reads pages and PDFs and stores findings in a local project knowledge graph
A web research skill: SearXNG searches, Camofox reads pages and CloakBrowser opens sites that check their visitors
Comparison with similar tools
Entries that share the main search query, and how they differ.
| Entry | Official | Authentication | Repository stars | Main difference |
|---|---|---|---|---|
| Google Scholar Skills (this entry) | no | 538 | ||
| CNKI Skills | no | 1,027 | the same approach for the Chinese CNKI database | |
| Paper Search MCP | no | key is optional | 2,941 | an MCP server searching arXiv, PubMed and other open sources through APIs |
| Zotero MCP | no | not required | 1,251 | connects a Zotero library to the agent and has no Google Scholar search |
README in short
The description is given in English and Chinese. It lists the requirements, a table of six skills with example calls, the gs-researcher agent and three setup steps: the Chrome DevTools MCP server, copying the skills and starting Chrome with a debugging port. It then explains how it works: page parsing with no screenshot recognition, data-cid as the key and one async script per operation. MIT license.
README badge
Original SKILL.md
---
name: gs-search
description: 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.
argument-hint: "[search keywords]"
---
# Google Scholar Basic Search
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:
```javascript
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() || '';