# Searching Literature

> Scopus relevance search (main) enriched with OpenAlex abstracts and OA links, via the rp_* tools pipeline

- Skill: `wentorai/searching-literature` (Agent Skill)
- Install (CLI): `npx skillmds@latest add wentorai/searching-literature`
- Raw SKILL.md: https://api.skillmd.com/api/skills/wentorai/searching-literature/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- Author: wentorai (https://skillmd.com/u/wentorai)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/wentorai/searching-literature

---


# Searching Scientific Literature

> **RC native tools** — this skill's pipeline ships as four built-in RC tools. Call them directly; do **not** shell out to any `rp.py` script or write curl:
> - `rp_search({ query, limit?, min_year? })` — Scopus relevance search enriched with OpenAlex abstracts + OA PDF links. The Elsevier key is built in.
> - `rp_abstracts({ dois })` — batch abstracts + OA links for a DOI list (OpenAlex, no key).
> - `rp_cite({ doi, direction?, limit? })` — citation traversal (`direction`: `both` / `backward` / `forward`).
> - `rp_fulltext({ doi, out? })` — OA full text (Elsevier ScienceDirect OA → OpenAlex OA fallback); pass `out` to also save the text to a file.
>
> Results return inline as JSON (there is no `--json <file>` flag). To persist a result set, save the returned JSON with the workspace file tools.


## Overview

Discovery runs on **one backbone: Scopus** (relevance-ranked, all-publisher coverage,
real citation counts), with **OpenAlex** layered on only to supply the data Scopus's
personal-key tier withholds (abstracts, OA full-text links). Both are driven by the
`the rp_* tools` tool — you do not hand-write curl.

**Core principle:** Scopus decides *what* and *in what order*; OpenAlex fills in *abstracts*.

> **Key entitlement reality (tested):** a personal Scopus API key exposes the STANDARD
> search view only — title, DOI, EID, citation count, year, OA flag. It does **not**
> return abstracts, references, or forward citations. That is why abstracts come from
> OpenAlex and citation traversal lives in `traversing-citations` (also OpenAlex). Do
> not try to pull abstracts/refs from Scopus; the calls 403.

## How to Search

### 1. Build the Scopus query

Scopus query syntax (richer than plain keywords — use it):

- `TITLE-ABS-KEY( ... )` — search title, abstract, keywords (the default workhorse)
- `AND` / `OR` / `AND NOT` — boolean
- `W/n` — proximity (e.g. `BTK W/3 selectivity`)
- `PUBYEAR > 2018` — date constraint
- `DOCTYPE(ar)` — article type (ar=article, re=review)

Examples:
```
TITLE-ABS-KEY(("BTK" OR "Bruton tyrosine kinase") AND inhibitor AND (selectivity OR "off-target"))
TITLE-ABS-KEY("CRISPR" AND cardiomyocyte) AND PUBYEAR > 2019
```

### 2. Run the search

```bash
rp_search "TITLE-ABS-KEY(BTK inhibitor selectivity)" \
    --limit 50 --min-year 2015
```

This single command:
1. Pages Scopus by relevancy (citation counts included).
2. Batch-fetches OpenAlex by DOI (50/call) to attach `abstract`, `oa_status`, `oa_pdf_url`.
3. Writes candidate records ready for scoring.

Each record:
```json
{
  "scopus_id": "85...", "eid": "2-s2.0-85...", "doi": "10.1016/...",
  "title": "...", "year": "2023", "cited_by": 42, "oa": true,
  "source": "Journal of Medicinal Chemistry",
  "abstract": "We report ...", "openalex_id": "W...",
  "oa_status": "gold", "oa_pdf_url": "https://..."
}
```

### 3. Report

Announce: `🔎 Scopus: N papers · M with abstracts (OpenAlex)`.
Then hand the candidate list to `evaluating-paper-relevance` for scoring.

## Coverage Notes (honest limits)

- **Abstract gaps:** OpenAlex lacks abstracts for some closed papers (notably parts of
  Elsevier/ACS). Expect roughly 50–80% abstract coverage. Papers with `"abstract": ""`
  must be scored from **title + journal + citation count** only, or deferred — never
  silently dropped. Flag them: `⚠️ No abstract (score from title)`.
- **Scopus quota:** 20,000 search results/week on the personal key. The pipeline paginates
  25/call, so a 50-result search costs 2 calls. Budget accordingly for large sweeps.
- **No Scopus abstracts/refs/fulltext-search** on this key — by design, see above.

## Quick Reference

| Task | Command |
|------|---------|
| Search + enrich | `rp_search "<scopus query>" --limit N` |
| Narrow | add `AND`, `PUBYEAR > Y`, `DOCTYPE(ar)`, more specific `TITLE-ABS-KEY` |
| Broaden | use `OR`, drop constraints, add synonyms |

## Common Mistakes

- **Hand-writing curl to Scopus** → use `the rp_* tools`; it handles paging, rate limits, caching.
- **Expecting abstracts from Scopus** → they come from OpenAlex; some will be missing.
- **Dropping abstract-less papers** → score them from title/citations or defer, don't hide them.
- **Ignoring the weekly quota** → 20k Scopus results/week; don't burn it on over-broad sweeps.

## Next Steps

After search: score with `evaluating-paper-relevance`; expand high scorers with
`traversing-citations`.

