# Gs Export

> Export Google Scholar paper(s) to Zotero via BibTeX. Gets citation data from Google Scholar's cite dialog, then pushes to Zotero desktop. Supports single or batch export.

- **Type:** Skill
- **Install:** `agentstack add skill-cookjohn-gs-skills-gs-export`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [cookjohn](https://agentstack.voostack.com/s/cookjohn)
- **Installs:** 0
- **Category:** [Agent Skills](https://agentstack.voostack.com/c/agent-skills)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [cookjohn](https://github.com/cookjohn)
- **Source:** https://github.com/cookjohn/gs-skills/tree/master/skills/gs-export

## Install

```sh
agentstack add skill-cookjohn-gs-skills-gs-export
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# 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 paper
- `TFS2GgoGiNUJ 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)

```javascript
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 `bibtexLink` URL from step 1a (on `scholar.googleusercontent.com`)

This bypasses CORS restrictions that block fetch() to googleusercontent.com.

#### 1c. Read BibTeX content (evaluate_script)

```javascript
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:

```bash
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:

```json
[
  {
    "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: book`
- `title={...}` → `title`
- `author={Last1, First1 and Last2, First2}` → `authors` array
- `journal={...}` → `journal`
- `year={...}` → `pubdate`
- `volume={...}` → `volume`
- `number={...}` → `issue`
- `pages={...}` → `pages`
- `publisher={...}` → (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:
1. Get all BibTeX links in one evaluate_script call (fetch all cite dialogs)
2. Navigate to each BibTeX URL one at a time
3. Collect all BibTeX entries
4. 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.py` for 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_page` with type `back`

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [cookjohn](https://github.com/cookjohn)
- **Source:** [cookjohn/gs-skills](https://github.com/cookjohn/gs-skills)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-cookjohn-gs-skills-gs-export
- Seller: https://agentstack.voostack.com/s/cookjohn
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
