Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Manage references and search Mendeley's catalog via REST API
.claude/skills/brycewang-stanford-mendeley-api/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 171% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 171% | 0% |
| case-01 | ✓→✓ | = Same ✓ | 97% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 58% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 84% | 0% |
Mendeley provides a reference management platform with a REST API for programmatic access to personal libraries, group collections, and the Mendeley Catalog — a crowdsourced database of 200M+ academic documents. The API supports OAuth 2.0 authentication, CRUD operations on documents/folders/annotations, and catalog search with rich metadata. Free tier available with registration.
Mendeley uses OAuth 2.0 with client credentials or authorization code flow.
bash# 1. Register app at https://dev.elsevier.com/ # 2. Get access token via client credentials (for catalog search) curl -X POST "https://api.mendeley.com/oauth/token" \ -d "grant_type=client_credentials" \ -d "scope=all" \ -d "client_id=$MENDELEY_CLIENT_ID" \ -d "client_secret=$MENDELEY_CLIENT_SECRET" # Response: { "access_token": "...", "expires_in": 3600, "token_type": "bearer" }
https://api.mendeley.comSearch across Mendeley's 200M+ document database:
bash# Search by title/keywords curl -H "Authorization: Bearer $TOKEN" \ "https://api.mendeley.com/catalog?query=deep+learning+NLP&limit=20" # Search by DOI curl -H "Authorization: Bearer $TOKEN" \ "https://api.mendeley.com/catalog?doi=10.1038/nature14539" # Search by title curl -H "Authorization: Bearer $TOKEN" \ "https://api.mendeley.com/catalog?title=attention+is+all+you+need"
bash# List documents in personal library curl -H "Authorization: Bearer $TOKEN" \ "https://api.mendeley.com/documents?limit=50&sort=created&order=desc" # Get document details curl -H "Authorization: Bearer $TOKEN" \ "https://api.mendeley.com/documents/{doc_id}" # Add document to library curl -X POST -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/vnd.mendeley-document.1+json" \ -d '{"title":"My Paper","type":"journal","year":2025,"authors":[{"first_name":"A","last_name":"B"}]}' \ "https://api.mendeley.com/documents"
bash# List folders curl -H "Authorization: Bearer $TOKEN" \ "https://api.mendeley.com/folders" # List group documents curl -H "Authorization: Bearer $TOKEN" \ "https://api.mendeley.com/documents?group_id={group_id}"
bash# Get annotations for a document curl -H "Authorization: Bearer $TOKEN" \ "https://api.mendeley.com/annotations?document_id={doc_id}"
| Parameter | Description | Example | |-----------|-------------|---------| | query | Free-text search | query=transformer+model | | doi | DOI lookup | doi=10.1234/example | | title | Title search | title=BERT | | author | Author filter | author=LeCun | | min_year | From year | min_year=2020 | | max_year | To year | max_year=2026 | | limit | Results per page (max 500) | limit=50 | | sort | Sort field | created, title, year | | order | Sort direction | asc or desc | | view | Response detail | bib (bibliographic), stats (reader counts) |
json{ "id": "abc123-...", "title": "Attention Is All You Need", "type": "conference_proceedings", "year": 2017, "authors": [ {"first_name": "Ashish", "last_name": "Vaswani"} ], "source": "NeurIPS", "identifiers": { "doi": "10.5555/3295222.3295349", "arxiv": "1706.03762" }, "keywords": ["attention mechanism", "transformer"], "abstract": "The dominant sequence transduction models...", "reader_count": 15432, "link": "https://www.mendeley.com/catalogue/..." }
pythonimport os import requests CLIENT_ID = os.environ["MENDELEY_CLIENT_ID"] CLIENT_SECRET = os.environ["MENDELEY_CLIENT_SECRET"] TOKEN_URL = "https://api.mendeley.com/oauth/token" BASE_URL = "https://api.mendeley.com" def get_token() -> str: """Obtain access token via client credentials.""" resp = requests.post(TOKEN_URL, data={ "grant_type": "client_credentials", "scope": "all", "client_id": CLIENT_ID, "client_secret": CLIENT_SECRET, }) resp.raise_for_status() return resp.json()["access_token"] def search_catalog(query: str, limit: int = 20, min_year: int = None) -> list: """Search the Mendeley catalog.""" token = get_token() params = {"query": query, "limit": limit, "view": "bib"} if min_year: params["min_year"] = min_year resp = requests.get( f"{BASE_URL}/catalog", headers={"Authorization": f"Bearer {token}"}, params=params, ) resp.raise_for_status() results = [] for doc in resp.json(): results.append({ "title": doc.get("title"), "authors": [f"{a['first_name']} {a['last_name']}" for a in doc.get("authors", [])], "year": doc.get("year"), "source": doc.get("source"), "doi": doc.get("identifiers", {}).get("doi"), "readers": doc.get("reader_count", 0), }) return results def lookup_by_doi(doi: str) -> dict: """Look up a single document by DOI.""" token = get_token() resp = requests.get( f"{BASE_URL}/catalog", headers={"Authorization": f"Bearer {token}"}, params={"doi": doi, "view": "bib"}, ) resp.raise_for_status() items = resp.json() return items[0] if items else {} # Example papers = search_catalog("federated learning privacy", min_year=2023) for p in papers: print(f"[{p['year']}] {p['title']} — readers: {p['readers']}")
Mendeley tracks how many users have saved each paper, providing a real-time measure of scholarly interest (unlike citation counts which lag by months).
pythondef get_popular_papers(topic: str, limit: int = 10) -> list: """Find most-read papers on a topic via reader counts.""" results = search_catalog(topic, limit=limit) return sorted(results, key=lambda x: x["readers"], reverse=True)
| Tier | Requests/hour | Catalog access | |------|--------------|----------------| | Free | 150 | Read-only catalog + personal library | | Institutional | Higher | Full API access |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | pass→pass | 13,082 | 20,995 | +60% | 1 | 1 | 0% | 2,666 | 5,262 | +97% | 0 | 0 | — |
case-02 | pass→pass | 15,611 | 17,536 | +12% | 1 | 1 | 0% | 3,168 | 5,005 | +58% | 0 | 0 | — |
case-03 | pass→pass | 8,062 | 4,570 | -43% | 1 | 1 | 0% | 1,547 | 2,847 | +84% | 0 | 0 | — |
case-04 | fail→pass | 6,685 | 5,895 | -12% | 1 | 1 | 0% | 1,176 | 3,187 | +171% | 0 | 0 | — |
case-05 | pass→pass | 7,997 | 5,858 | -27% | 1 | 1 | 0% | 1,295 | 3,037 | +135% | 0 | 0 | — |
case-06 | pass→pass | 6,454 | 4,706 | -27% | 1 | 1 | 0% | 1,291 | 3,035 | +135% | 0 | 0 | — |
case-07 | pass→pass | 3,690 | 3,312 | -10% | 1 | 1 | 0% | 725 | 2,531 | +249% | 0 | 0 | — |
case-08 | pass→pass | 4,247 | 2,107 | -50% | 1 | 1 | 0% | 601 | 2,382 | +296% | 0 | 0 | — |
case-09 | pass→pass | 3,669 | 1,774 | -52% | 1 | 1 | 0% | 532 | 2,369 | +345% | 0 | 0 | — |
case-10 | pass→pass | 5,550 | 2,299 | -59% | 1 | 1 | 0% | 909 | 2,445 | +169% | 0 | 0 | — |
case-11 | fail→pass | 5,867 | 1,546 | -74% | 1 | 1 | 0% | 834 | 2,259 | +171% | 0 | 0 | — |
case-12 | pass→pass | 5,546 | 2,237 | -60% | 1 | 1 | 0% | 919 | 2,359 | +157% | 0 | 0 | — |
case-13 | pass→pass | 5,937 | 4,061 | -32% | 1 | 1 | 0% | 1,061 | 2,859 | +169% | 0 | 0 | — |
case-14 | pass→pass | 4,242 | 2,039 | -52% | 1 | 1 | 0% | 574 | 2,359 | +311% | 0 | 0 | — |
case-15 | pass→pass | 6,456 | 2,263 | -65% | 1 | 1 | 0% | 946 | 2,422 | +156% | 0 | 0 | — |
case-16 | pass→pass | 6,576 | 4,171 | -37% | 1 | 1 | 0% | 939 | 2,577 | +174% | 0 | 0 | — |
case-17 | pass→pass | 5,197 | 2,305 | -56% | 1 | 1 | 0% | 858 | 2,422 | +182% | 0 | 0 | — |
case-18 | pass→pass | 2,656 | 2,038 | -23% | 1 | 1 | 0% | 491 | 2,423 | +393% | 0 | 0 | — |
case-19 | pass→pass | 3,245 | 2,987 | -8% | 1 | 1 | 0% | 599 | 2,447 | +309% | 0 | 0 | — |
case-20 | pass→pass | 4,524 | 2,280 | -50% | 1 | 1 | 0% | 816 | 2,448 | +200% | 0 | 0 | — |
case-21 | pass→pass | 4,993 | 3,550 | -29% | 1 | 1 | 0% | 875 | 2,576 | +194% | 0 | 0 | — |
case-22 | pass→pass | 8,347 | 5,918 | -29% | 1 | 1 | 0% | 1,374 | 3,342 | +143% | 0 | 0 | — |
case-23 | pass→pass | 8,335 | 7,651 | -8% | 1 | 1 | 0% | 1,655 | 3,254 | +97% | 0 | 0 | — |
case-24 | pass→pass | 14,019 | 13,637 | -3% | 1 | 1 | 0% | 2,641 | 4,681 | +77% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted. The headline lift of +8 percentage points is the difference between those two pass rates over the 24 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.