gs-export
Google Scholar Export to Zotero
Export Google Scholar paper citation data via BibTeX extraction and push to Zotero desktop.
Arguments
$ARGUMENTS contains one or more data-cids (space-separated), e.g.:
TFS2GgoGiNUJ— single paperTFS2GgoGiNUJ abc123XYZ def456UVW— batch export
Steps
Step 1: Get BibTeX for each paper
For each data-cid, perform 3 tool calls to bypass CORS:
1a. Fetch cite dialog to get BibTeX link (evaluate_script)
async () => {
const cid = "DATA_CID_HERE";
const resp = await fetch(
`https://scholar.google.com/scholar?q=info:${cid}:scholar.google.com/&output=cite`,
{ credentials: 'include' }
);
const html = await resp.text();
const doc = new DOMParser().parseFromString(html, 'text/html');
// Extract export links
const links = Array.from(doc.querySelectorAll('#gs_citi a')).map(a => ({
format: a.textContent.trim(),
url: a.href
}));
// Extract citation format texts
const citations = Array.from(doc.querySelectorAll('#gs_citt tr')).map(tr => {
const cells = tr.querySelectorAll('td');
return {
style: cells[0]?.textContent?.trim() || '',
text: cells[1]?.textContent?.trim() || ''
};
});
const bibtexLink = links.find(l => l.format === 'BibTeX');
return { cid, bibtexLink: bibtexLink?.url || '', links, citations };
}
1b. Navigate to BibTeX URL (navigate_page)
Use mcp__chrome-devtools__navigate_page:
- url: the
bibtexLinkURL from step 1a (onscholar.googleusercontent.com)
This bypasses CORS restrictions that block fetch() to googleusercontent.com.
1c. Read BibTeX content (evaluate_script)
async () => {
return { bibtex: document.body.innerText || document.body.textContent || '' };
}
Step 2: Parse BibTeX and push to Zotero
Save the BibTeX data as JSON, then call the push script:
python "E:/gscholar-skills/.claude/skills/gs-export/scripts/push_to_zotero.py" /tmp/gs_papers.json
Before calling the script, construct a JSON file at /tmp/gs_papers.json containing paper data parsed from BibTeX. Parse the BibTeX yourself and create the JSON array:
[
{
"pmid": "",
"title": "The title from BibTeX",
"authors": [
{"lastName": "Smith", "firstName": "John"}
],
"journal": "Journal Name",
"journalAbbr": "",
"pubdate": "2022",
"volume": "14",
"issue": "4",
"pages": "1054",
"doi": "",
"pdfUrl": "https://example.com/paper.pdf",
"abstract": "",
"keywords": [],
"language": "en",
"pubtype": ["Journal Article"]
}
]
IMPORTANT: Set pdfUrl from the search result's fullTextUrl field (the PDF link extracted by gs-search). The Python script will download the PDF and upload it to Zotero via /connector/saveAttachment (Zotero 7.x ignores attachments in saveItems). PDF download may fail for some publishers (403, JS-redirect); these are reported as "PDF skip".
BibTeX fields mapping:
@article{key,→itemType: journalArticle@inproceedings{key,→itemType: conferencePaper@book{key,→itemType: booktitle={...}→titleauthor={Last1, First1 and Last2, First2}→authorsarrayjournal={...}→journalyear={...}→pubdatevolume={...}→volumenumber={...}→issuepages={...}→pagespublisher={...}→ (included in extra or publisher field)
Step 3: Report
Single paper:
Exported to Zotero from Google Scholar:
Title: {title}
Authors: {authors}
Journal: {journal} ({year})
Data-CID: {dataCid}
Batch:
Exported {count} papers to Zotero from Google Scholar:
1. {title1} ({journal1}, {year1})
2. {title2} ({journal2}, {year2})
...
Batch Export Optimization
For multiple papers, process sequentially to avoid CAPTCHA:
- Get all BibTeX links in one evaluate_script call (fetch all cite dialogs)
- Navigate to each BibTeX URL one at a time
- Collect all BibTeX entries
- Push all to Zotero in a single batch
Notes
- Single paper export uses 3-4 tool calls:
evaluate_script(cite dialog) +navigate_page(BibTeX URL) +evaluate_script(read BibTeX) +bash python(Zotero push) - Batch export: 2N+1 tool calls (N papers: N navigate + N evaluate + 1 bash)
- BibTeX links are on
scholar.googleusercontent.com— CORS blocks fetch(), so we use navigate_page to bypass - Reuses
push_to_zotero.pyfor Zotero Connector API communication - Google Scholar BibTeX does NOT include abstract or DOI — these fields will be empty in Zotero
- After export, navigate back to Google Scholar page:
navigate_pagewith typeback