Skip to main content
Glama
README.md
# scopus-mcp

[![npm version](https://img.shields.io/npm/v/scopus-mcp)](https://www.npmjs.com/package/scopus-mcp)
[![Node.js](https://img.shields.io/node/v/scopus-mcp)](https://nodejs.org/)
[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)

An MCP server for the Elsevier Scopus API. Runs over stdio with `npx` and keeps
the API's parameter names and JSON responses.

## Quick start

Requires Node.js **22.22.0 or newer**, npm, and an MCP client with stdio support.
Get an API key from the [Elsevier Developer Portal](https://dev.elsevier.com/)
and add this server to your client's configuration:

```json
{
  "mcpServers": {
    "scopus": {
      "command": "npx",
      "args": ["-y", "scopus-mcp"],
      "env": {
        "ELSEVIER_API_KEY": "your-elsevier-api-key"
      }
    }
  }
}
```

Reload the client to connect. To pin a release, use `scopus-mcp@<version>` in `args`.

## Configuration

| Environment variable  | Description                                              |
| --------------------- | -------------------------------------------------------- |
| `ELSEVIER_API_KEY`    | Required for all tools except `subject_classifications`. |
| `ELSEVIER_INST_TOKEN` | Institutional token, if provided by your institution.    |

Set credentials in the client's `env` object. The server does not load `.env`
files. Access to data and views depends on your Elsevier subscription and
institutional access.

The server reports its version in MCP `serverInfo` and the startup log on `stderr`.

## Tools

| Tool                                                             | Description                               |
| ---------------------------------------------------------------- | ----------------------------------------- |
| [scopus_search](docs/tools/scopus-search.md)                     | Find publications.                        |
| [author_search](docs/tools/author-search.md)                     | Find authors and co-authors.              |
| [affiliation_search](docs/tools/affiliation-search.md)           | Find institutions.                        |
| [author_retrieval](docs/tools/author-retrieval.md)               | Get author profiles by ID, EID, or ORCID. |
| [affiliation_retrieval](docs/tools/affiliation-retrieval.md)     | Get an institution profile by ID or EID.  |
| [citation_overview](docs/tools/citation-overview.md)             | Get yearly citation counts and summaries. |
| [plumx_metrics](docs/tools/plumx-metrics.md)                     | Get publication metrics by identifier.    |
| [subject_classifications](docs/tools/subject-classifications.md) | Look up subject codes; no API key needed. |

Each call makes one API request. For additional pages, use the tool's pagination
parameters. Requests support cancellation and a 30-second timeout; retries and
redirects are not automatic.

## Responses and errors

Results follow each tool's `outputSchema`. The original API JSON is returned in
both `structuredContent` and a text content block, without reshaping fields or
converting values.

Available quota headers are returned as strings in `_meta["scopus-mcp/headers"]`:
`X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset`, and `Retry-After`.

API failures return `isError: true` and a JSON text error with `code`, `message`,
and, when available, an HTTP `status`. Credentials are redacted. Invalid arguments
are rejected before an API request.

| Error                        | What to check                                                   |
| ---------------------------- | --------------------------------------------------------------- |
| `MISSING_API_KEY`            | Set `ELSEVIER_API_KEY` in the server's environment.             |
| HTTP 401 or 403              | Check your key, subscription, institutional network, and token. |
| HTTP 429                     | Check quota headers and `Retry-After` before retrying.          |
| `TIMEOUT` or `NETWORK_ERROR` | Check connectivity to `api.elsevier.com`.                       |
| `INVALID_RESPONSE`           | Elsevier returned invalid JSON or an unexpected response shape. |

## API documentation

- [Scopus API specification](https://dev.elsevier.com/sc_api_spec.html)
- [Interactive API documentation](https://dev.elsevier.com/scopus.html)
- [API limits and quotas](https://dev.elsevier.com/api_key_settings.html)

## Development

See [Contributing](CONTRIBUTING.md) for local setup and changes, and
[Releases](docs/releases.md) for publishing.

## License

[MIT](LICENSE) © 2026 Andrii Baran. Independent project, not affiliated with Elsevier.

TDQS

A4.1/5.0

Scored across 8 tools

Disambiguation5/5

Each tool pairs a distinct entity with a distinct action: author_search/author_retrieval and affiliation_search/affiliation_retrieval are cleanly separated by query-vs-id, and citation_overview, plumx_metrics, scopus_search, and subject_classifications each target unique resources. There is no meaningful overlap that would cause misselection.

Naming Consistency4/5

Most tools follow a predictable entity_action pattern (author_search, affiliation_retrieval, scopus_search, etc.), which is easy to parse. However, citation_overview, plumx_metrics, and subject_classifications are noun-only with no verb, a minor deviation from the dominant convention.

Tool Count5/5

Eight tools is well-scoped for a Scopus API wrapper, with two search/retrieve pairs for authors and affiliations plus publication search, citations, metrics, and classifications. Each tool earns its place without redundancy.

Completeness4/5

Coverage is broad: search and retrieval for authors and affiliations, publication search, citation overview, PlumX metrics, and subject classifications. The main gap is a document-level retrieval tool (e.g., fetch a specific publication by DOI/EID), which agents must currently work around.

Maintenance

ActivityMaintained
ResponsivenessNo issues