Scopus Plus MCP
Uses an Elsevier Developer Portal API key to access Elsevier's Scopus and ScienceDirect data, including full-text search for terms inside the body of Elsevier papers and journal quality metrics (SJR, CiteScore, quartiles). Includes a diagnose_connection tool that reports which tools a given Elsevier/Scopus subscription supports and why others fail, and a quota status check.
Provides tools for searching Scopus literature and retrieving records: paper search, abstract details, full-text access, identifier and author resolution, author profiles, references and citing papers. Also builds citation networks (bibliographic coupling, co-citation, multi-generation citation lineage with main-path analysis, exportable as GraphML for VOSviewer/Gephi) and computes bibliometrics such as publication counts per year, topic landscapes, journal metrics and find_journals percentile filtering, plus BibTeX export for any list of papers.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Scopus Plus MCP trace two generations of work citing Swanson & Ramiller (1997) and show the main path"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Search the literature, trace who cites whom across generations, map research fronts and intellectual bases, and pull the counts, metrics and bibliography you need, from a conversation. It is an MCP server, so any MCP client can use it: Claude Desktop, Claude Code, Cursor.
What you get
How it compares with the other Scopus MCP servers and with bibliometrics packages (bibliometrix, pybliometrics, VOSviewer, Pajek): comparison.
Related MCP server: Strato Scopus MCP
Ask things like
Map the research front around these six papers on organizing visions.
Trace two generations of work citing Swanson & Ramiller (1997) and show me the main path.
Build the citation network of every Basket of Eight paper citing the organizing-vision papers, and show how the main path cites its predecessors.
How has publishing on "digital transformation" grown since 2010?
Build a corpus on digital transformation across IS, strategy and marketing, top-quartile journals only, and show which fields cite which.
Get SJR and CiteScore for the Basket of Eight, and BibTeX for the papers we just found.
More, with the tools each one triggers: prompt examples.
How it works
You ask in plain words and the assistant picks the tools. The server calls Scopus with your own key, and Crossref, Semantic Scholar and open-access sources where a tool needs them. Results come back as a summary in the reply, and the full data goes to files that Pajek, VOSviewer, Gephi or Zotero can open. Responses are cached, and long jobs run in the background.
Tools
Family | Tools | Guide | |
Search and records |
| ||
Citations |
| ||
Networks |
| ||
Audit |
| ||
Bibliometrics |
| ||
Diagnostics and jobs |
|
Every parameter of every tool: tool reference.
Install
You need an API key from the Elsevier Developer Portal (register with your institutional email). OpenAlex needs no key.
Claude Desktop, one click:
Download
scopus-plus-mcp-<version>.mcpbfrom the latest release.Open it (or drag it into Settings → Extensions), click Install, and paste your API key when asked. Claude stores it securely.
Claude Code, two commands:
claude plugin marketplace add michalhron/scopus-plus-mcp
claude plugin install scopus-plus-mcp@michalhronThen make your key available, either in your shell
(export SCOPUS_API_KEY=...) or, better, in the
OS secret store.
Any other MCP client (needs uv):
{
"mcpServers": {
"scopus-plus": {
"command": "uvx",
"args": ["scopus-plus-mcp"],
"env": { "SCOPUS_API_KEY": "YOUR_KEY" }
}
}
}Then ask your assistant to run diagnose_connection. It checks your key and
tells you which tools your Scopus access supports.
The Claude Code plugin also installs the main-path skill, which walks Claude through a main path analysis from a query to a drawn map. For Claude Desktop, zip its folder and upload it as a skill.
Documentation
Feature guides:
Search, records and full text: finding papers and authors, identifiers, importing exports, full-text search and retrieval.
Citation networks and main paths: coupling, co-citation, lineages, main path analysis, historiograph, RPYS, research fronts.
Audit: verified citer sets, reference-list completeness, citation contexts, the transmission audit, retractions.
Bibliometrics and bibliography: counts per year, topic landscape, journal cut-offs and metrics, thematic evolution, BibTeX.
Reference and setup:
Tool reference: every tool and parameter, generated from the code.
Data sources: Scopus vs OpenAlex, when to use which, measured coverage.
Configuration: all settings, and keeping keys in the OS secret store.
Access and troubleshooting: off-campus access, tokens, proxies, reading
diagnose_connection.Comparison: this project vs the other Scopus MCP servers, and vs bibliometrics packages.
Origins
Formerly citation-network-mcp (and before that michalhron/scopus-mcp). This project began as a fork of
qwe4559999/scopus-mcp by
thinktraveller and
qwe4559999, which provides Scopus search,
abstracts, author profiles and citing papers. Everything since version 0.2
was developed here by Michal Hron. MIT
licensed; see LICENSE.
Scopus and ScienceDirect are trademarks of Elsevier B.V. This project is independent and not affiliated with or endorsed by Elsevier; it uses their public APIs with your own key and subscription.
Available Tools
35 toolsbibliographic_couplingA
Build a bibliographic-coupling graph for a set of seed papers. Two seeds are coupled when they share cited references; edge weight = count of shared references, cosine = Salton index. Maps the current research front. Scopus needs an entitled (subscriber) key for REF-view access; source='openalex' does not. Output: GraphML + CSV edge list written to disk.
Inputs: seed_ids (required), source, min_shared.
check_retractionsA
Retractions, withdrawals, expressions of concern and corrections for a set of papers, from Crossref (which carries the Retraction Watch database). Give DOIs, Scopus IDs, or a corpus_file from import_records. citation_network runs the same check on every network by default.
Inputs: ids, dois, corpus_file.
citation_contextA
How one paper cites another: the citing sentences, the citation intent (background, methodology, result) and whether Semantic Scholar classes the citation as influential. Evidence for whether a citation edge carries the cited idea or is a passing mention. Up to 50 pairs per call; IDs are DOIs, Scopus IDs or OpenAlex IDs, resolved to Semantic Scholar by DOI, MAG ID, then title and year (the route is reported). Statuses: found, contexts_withheld (the citation is known, its sentences are not), edge_absent_in_s2, citing_paper_unresolved, cited_paper_unresolved. Contexts are cleaned of page headers and citation-free noise and ranked, most informative first. Where Semantic Scholar has no usable sentences, the citing paper's full text is searched instead (context_source: semantic_scholar, fulltext_sciencedirect, fulltext_oa or none).
Inputs: cited, pairs, citing, max_contexts, +2 more.
citation_lineageA
Walk the citation lineage of a seed paper across multiple generations. Forward: generation 1 = papers that cite the seed; generation 2 = papers that cite those; up to 3 generations. Backward: walks cited references. All papers are deduplicated globally. Output: corpus written to disk as JSON plus compact inline summary; the corpus is also returned inline as base64 so sandboxed callers can inspect it. Use sort='citedby' (default for forward) to collect the most-cited citers first, which gives a meaningful citation-backbone; sort='coverDate' collects the most recent citers first (which can produce a recency-dominated walk). source='openalex' walks OpenAlex instead (no Scopus entitlement; node IDs are OpenAlex work IDs; reference lists are thinner and absent for AIS eLibrary papers). Server version is included in every response.
Inputs: seed_id (required), sort, scope, source, +4 more.
citation_networkA
Direct-citation network within a set of papers, in one call: fetches every paper's reference list, keeps only the references to other papers in the set, and runs main-path analysis (SPC weights, local and global main path, key routes). Give ids (Scopus IDs/EIDs; with source='openalex', DOIs or OpenAlex IDs) or a query. Completeness: each list is compared with an independent reference count (Crossref, else OpenAlex, else Semantic Scholar; the source is reported per paper); short = fewer than 90% of the comparison count and at least 5 references missing (SCOPUS_COMPLETENESS_RATIO, SCOPUS_COMPLETENESS_MIN_MISSING). Papers whose references could not be loaded or parsed are listed, retried once after rate limits, and the main path is marked provisional while any are missing. Likely duplicate records are listed. Writes JSON, Pajek .net (arcs from cited to citing, SPC weights; Pajek, VOSviewer, Gephi) and an edge CSV. Cost: one reference request per paper (cached). Sets over about 50 papers may return a job ID: poll job_status, then job_result.
Inputs: ids, page, query, scope, +14 more.
co_citationA
Build a co-citation graph for a set of seed papers. Two seeds are co-cited when a later paper cites both; edge weight = count of co-citing papers, cosine = Salton index. Maps the intellectual base of a field. max_citing_per_seed bounds the API quota used per seed. Output: GraphML + CSV edge list written to disk.
Inputs: seed_ids (required), source, min_shared, max_citing_per_seed.
coding_agreementA
Inter-coder agreement on a coding sheet from path_transmission (or citation_network with edge_contexts) once two coders have filled their columns: Cohen's kappa with a 95% interval and its Landis & Koch reading, agreement per label, the confusion matrix and the disagreeing edges. Also scores the draft labels against each coder and against the coders' consensus, i.e. how far the heuristic can be trusted. Reads .csv (comma, semicolon or tab), as saved from Excel.
Inputs: path (required), coder_columns, reference_column.
diagnose_connectionA
Diagnose Scopus connectivity and entitlement. Checks config presence, api.elsevier.com reachability, metadata and search entitlement, and per-API capabilities (REF-view references, ScienceDirect full text, Serial Title journal metrics). Returns a JSON report with a one-line verdict and 'unavailable_tools', the tools that cannot work with the current access. Run this first when Scopus behaves strangely — especially when valid searches fail with 'Error translating query', which usually means missing subscriber entitlement (off-network without SCOPUS_INSTTOKEN), not bad query syntax.
Inputs: no named parameters.
find_journalsA
List the journals in one or more Scopus subject categories at or above a CiteScore percentile within that category: the quality cut-off for scoping a literature review (Q1 = 75, top 10% = 90). Categories are ASJC names or codes, e.g. 'Information Systems' (1710), 'Management Information Systems' (1404); ambiguous names return the candidates. Returns each journal's rank, percentile, quartile and CiteScore, a CSV, and ready-to-use Scopus query fragments SRCID(...) for search_all. Percentiles are from the latest complete CiteScore year.
Inputs: categories (required), journals_only, min_percentile.
get_abstract_detailsC
Retrieve full details for a specific document by Scopus ID.
Inputs: scopus_id (required).
get_author_profileC
Retrieve an author's profile by Author ID.
Inputs: author_id (required).
get_bibtexA
BibTeX entries for a list of papers, written to a .bib file and returned inline. Identifiers may be DOIs, Scopus IDs/EIDs or OpenAlex work IDs. Entries come from the publisher's metadata via DOI content negotiation (errors included, so check author names). Papers without a DOI, such as AIS conference papers, get a minimal entry built from Scopus or OpenAlex metadata, marked with a note. At most 200 identifiers per call.
Inputs: identifiers (required).
get_citing_papersC
Retrieve a list of papers that have cited the specified document (Forward Citations).
Inputs: scopus_id (required), sort, count, source.
get_fulltextA
Retrieve the full text of a paper via a provider waterfall: (1) ScienceDirect full text (requires SCOPUS_INSTTOKEN or institutional IP), (2) open-access copy: every open location in OpenAlex, Semantic Scholar's open PDF and arXiv ID, arXiv by exact title, Europe PMC, and Unpaywall or CORE when configured; published versions first, and the result names the source and version (preprint, accepted manuscript, published), (3) Scopus abstract fallback. Returns provenance, character count, file path, and a ~1500-char sample. Full body is written to disk — never returned inline. ToS note: retrieval is for the user's own non-commercial text-and-data-mining; content written to local disk must not be redistributed.
Inputs: doi (required), prefer.
get_journal_metricsA
Journal metrics for a list of journals, e.g. a litbaskets basket. Scopus (default): SJR, SNIP, CiteScore and CiteScore Tracker with their years, plus subject areas, from the Serial Title API. Give ISSNs, or Scopus source IDs (SRCIDs), which are mapped to ISSNs through one Scopus search each (needs search entitlement). source='openalex': OpenAlex's own measures (2-year mean citedness, h-index, i10-index), ISSNs only, no entitlement. Journals not found are listed, never dropped. Also written to CSV. At most 200 journals per call.
Inputs: issns, source, source_ids.
get_quota_statusA
Get the current API quota status (remaining/limit). Note: Values are updated only after making a request.
Inputs: no named parameters.
get_referencesA
Retrieve the cited-reference list of a document (Backward Citations) via the Abstract Retrieval REF view. Complements get_citing_papers, which returns forward citations. Scopus requires an entitled (subscriber) key; source='openalex' does not.
Inputs: scopus_id (required), count, source, filter_ids, +1 more.
get_server_infoA
Return the server version and a health summary. Call this to confirm which build you are talking to.
Inputs: no named parameters.
historiographA
Garfield's historiograph: the papers most cited within the set (local citation score) on a time axis, with the citations among them and the global main path highlighted. Complements the main path with the picture readers expect beside it. Give ids or a query. Writes a PNG and a Pajek file; lists the papers with their local and global citation counts.
Inputs: ids, top, query, scope, +3 more.
import_recordsA
Read saved bibliographic exports into one deduplicated corpus file: Scopus CSV, RIS or BibTeX exports and Web of Science plain-text or tab-delimited exports (format detected). Records are merged across files by Scopus ID, WoS ID, DOI, or title and year. With resolve (default true), records without a Scopus ID (e.g. from Web of Science) are matched in Scopus by DOI, then by exact title and year. Returns the corpus file path and the Scopus IDs. Pass the file as corpus_file to citation_network, rpys, historiograph, research_fronts or thematic_evolution to analyse exactly these records again later (thematic_evolution then reads keywords from the file, with no API calls).
Inputs: paths (required), resolve.
index_coverageB
Which papers cite the seeds according to Scopus, OpenAlex and Semantic Scholar, under the same journal scope, and how the three sets overlap. Papers are matched by DOI, else by title and year. Makes index coverage a reported property of a study rather than a hidden one. Scopus side: REF() search (not verified; use resolve_citers for that).
Inputs: seed_ids (required), scope, max_results.
job_resultC
Output of a finished background job (its status if still running).
Inputs: job_id (required).
job_statusB
State of a background job started by a long tool call (citation_network, resolve_citers, ...) that passed the sync budget: running, finished or failed, and its last step.
Inputs: job_id (required).
path_transmissionA
Transmission audit of a main path: for each consecutive edge (later paper citing the earlier one) it gathers the citing sentences (Semantic Scholar, then the citing paper's full text), Semantic Scholar's intent and influential flags, how many contexts name the construct terms, and whether the citation sits in a list of three or more works. Proposes a draft label per edge (substantive, construct-shifted, hollow, unresolved) with its evidence, and writes a CSV coding sheet with blank columns for two independent coders. Draft labels are heuristics for a human coder to confirm or overturn, not findings: substantive = the citing paper engages the cited work (influential, method/result intent, or two or more non-list contexts) and a context names a construct term in the cited work's own clause; construct-shifted = engages it without naming the construct; hollow = only background or list citations; unresolved = no context sentences from any source.
Inputs: path_ids (required), construct_terms (required), corpus_json, max_contexts.
publication_countsA
Count publications per year for a query, e.g. to chart how attention to a topic rose and fell. Scopus: your query in Scopus syntax, one request per year, so from_year and to_year are required (at most 60 years). OpenAlex: plain words matched against title and abstract (quote phrases), one request for all years. The two sources count differently; compare trends within one source, not levels across sources.
Inputs: query (required), source, to_year, from_year.
research_frontsA
Research fronts of a paper set: Louvain communities of its direct-citation network (as in CitNetExplorer), each described by its years, density, core papers (most cited within the set) and the keywords that distinguish it. Also reports which front each paper of the global main path belongs to and where the path hops from one front to another: a main path that stays in one front traces a single conversation, one that hops stitches several together. Give ids or a query. Writes JSON and Pajek .net plus .clu (partition) files. Cost: one reference and one abstract request per paper (cached).
Inputs: ids, query, scope, source, +4 more.
resolve_citersA
All papers citing one or more seed papers, found by several search strategies at once and verified. Runs REF() on each seed plus any extra queries (for example a title-phrase query), merges the hits, then checks each hit's own reference list for the seeds. Reports a per-strategy table (hits, confirmed, unconfirmed, verification failed, confirmed citers the strategy missed). With cross_check (default on when scope is given) it also asks OpenAlex and Semantic Scholar which in-scope papers cite the seeds and lists those Scopus misses or cannot confirm, with Scopus's reference count against the external one, so truncated Scopus reference lists become visible. The Scopus result stays Scopus-only. Long runs may return a job ID: poll job_status, then job_result.
Inputs: seed_ids (required), scope, inline, source, +4 more.
resolve_identifierA
Resolve any document identifier (Scopus ID, EID, DOI, or PII) to the full cross-reference set (scopus_id, eid, doi, pii, title). Use this to obtain a DOI for cross-linking with OpenAlex/Crossref, or to normalize an ID before calling other tools.
Inputs: identifier (required), id_type.
rpysA
Reference Publication Year Spectroscopy (Marx et al. 2014): counts every cited reference of a set of papers by the year the cited work appeared, subtracts the five-year median, and reports the peak years with the works cited most from each: the set's historical roots. Give ids or a query (e.g. the confirmed citers from resolve_citers). Writes a CSV of the spectrogram and a PNG. Cost: one reference request per paper (cached; shared with citation_network). With source='openalex' the cited works are fetched in batches of 50.
Inputs: ids, query, scope, source, +5 more.
search_allA
Search Scopus (or OpenAlex with source='openalex') and page through results automatically, returning up to max_results entries in one call. Scopus pages hold SCOPUS_PAGE_SIZE records (default 25) and switch to cursor paging beyond 5,000; OpenAlex pages hold 200. Results over 50 records are written to disk as JSON and CSV. Large max_results values consume significant quota — use conservatively.
Inputs: query (required), sort, scope, inline, +2 more.
search_authorsA
Find authors by name, optionally narrowed by affiliation. Scopus (default, needs subscriber entitlement): author IDs for get_author_profile, document counts, current affiliation, subject areas and name variants, ranked by document count. OpenAlex: OpenAlex author IDs, ORCID, works and citation counts, h-index, institution and topics. Common surnames need an affiliation or given name to be useful.
Inputs: name (required), count, source, affiliation.
search_fulltextA
Search the full text of Elsevier (ScienceDirect) journal articles, not just titles and abstracts: finds papers that use a construct in their body without naming it up front. Needs Scopus/ScienceDirect subscriber access; covers Elsevier-published content only. With context=true, the top results' full texts are retrieved to count mentions in the body (separately from the reference list), give their positions through the article, and quote example sentences: how a paper uses the construct, not just that it does. Up to 1000 results; over 50 are written to JSON and CSV.
Inputs: query (required), sort, context, journal, +5 more.
search_scopusC
Search for documents in Scopus using a query string.
Inputs: query (required), sort, count.
thematic_evolutionA
Themes of a corpus and how they change over time (Cobo et al. 2011; as in bibliometrix's thematic map and thematic evolution). Per period: keyword co-occurrence clusters, each placed in the strategic diagram by Callon centrality and density (motor, basic, niche, emerging or declining); between periods: which themes continue, split, merge, appear or vanish (inclusion index). With construct_terms it follows a construct through the periods: the theme that holds it, where that theme sits, and the keywords it keeps company with, i.e. whether the construct stays central, drifts or dissolves into another. Give ids or a query. Writes JSON, CSV and a PNG of the strategic diagrams. Cost: one abstract request per paper (cached).
Inputs: ids, query, scope, terms, +7 more.
topic_landscapeA
Where and at what prestige a topic is published. Runs a Scopus query and reports (1) papers per broad subject area over all results, and (2) per subject category, how many papers appear in Q1, Q2, Q3 and Q4 journals of that category, with the main journals. A journal can be Q1 in one category and Q3 in another, so each paper counts in every category of its journal. By default quartiles count journal papers only: proceedings series such as IFAC-PapersOnLine or Procedia CIRP also carry CiteScore ranks, and are reported separately with book series, together with the overall mix of venue types. Large topics are analysed on a sample of max_papers papers (up to 2000): most recent by default, or most cited to see where influential work appears; coverage is stated. Needs Scopus search entitlement.
Inputs: query (required), sample, to_year, from_year, +3 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 35 tools
Most tools target clearly distinct bibliometric operations, with descriptions that explain unique workflows. A few boundaries blur, especially job_status vs job_result and citation_lineage vs citation_network vs resolve_citers, but the detailed descriptions usually disambiguate them.
Tool names are consistently snake_case and mostly follow predictable verb_noun or resource-oriented phrasing. Minor deviations include acronym-style rpys and several noun-phrase analysis names, but overall the convention is readable and stable.
With 35 tools, the server exceeds the practical threshold where an agent can easily scan and select without overload. Although the domain is broad, many advanced analyses could be grouped or layered behind fewer entry points.
The surface covers the research lifecycle well: search, identifier resolution, full-text retrieval, citation analysis, journal metrics, exports, imports, diagnostics, and background jobs. Only minor gaps remain, such as lack of direct document-level metrics or broader export/lifecycle operations, but these are generally workable.
Maintenance
Related MCP Connectors
Academic literature search, retrieval, and private library management on top of OpenAlex.
Research paper search with real citations and reference formatting for AI assistants
Search arXiv/Semantic Scholar/OpenAlex + medical evidence (PubMed/Europe PMC) + LaTeX/PDF tools.
Search 340M+ academic papers — citation graphs, semantic similarity, and AI literature reviews.
Related MCP Servers
- AlicenseAqualityDmaintenanceProvides access to the Elsevier Scopus API, enabling AI assistants to search for academic papers, retrieve detailed abstracts, and look up author profiles. It facilitates bibliometric research and scholarly data analysis through natural language commands.5107 PyPI53MIT
- AlicenseNot gradedqualityDmaintenanceConnects Scopus to AI assistants for literature discovery. Provides tools for finding papers, experts, citation networks, and analyzing research trends.2GPL 2.0
- AlicenseAqualityDmaintenanceEnables AI assistants to search and retrieve real academic papers from Scopus, preventing citation hallucination by providing accurate paper metadata, author info, and citation analysis.153MIT
- AlicenseAqualityCmaintenanceEnables searching for scientific papers across OpenAlex, CrossRef, and Unpaywall, and downloading open-access PDFs directly through Claude Desktop.51MIT