Scopus MCP Server
Scopus MCP Server
Сервер MCP, который оборачивает Elsevier Scopus API, чтобы MCP-клиент (Claude Desktop, Claude Code или любой другой MCP-хост) мог искать и получать опубликованные научные статьи — полезно для проверки цитирования и анализа стиля на основе реальных рецензируемых источников.
Tools
Tool | Input | What it returns |
|
| До |
|
| Полные метаданные для одной стати: всё вышеперечисленное плюс ключевые слова автора, предметные области, флаг открытого доступа, тип агрегации |
|
| Только текст аннотации для одной стати, плюс |
Все ответы представляют собой структурированный JSON (см. Форма ответа ниже). Каждый инструмент возвращает понятную структурированную ошибку вместo исключения, когда Scopus API недоступен, превышен лимит запросов или передан неверный ID — см. Обработка ошибок.
Под капотом сервер вызыват два API Elsevier:
Scopus Search API (
GET /content/search/scopus) — использутсяsearch_scopus.Abstract Retrieval API (
GET /content/abstract/scopus_id/{id}) — использутсяget_article_detailsиget_article_abstract, посколькю Search API не гарантирует надёжный возврат полных аннотаций, числа цитирований или ключевых слов.
Related MCP server: MCP-scopus
Project layout
mcp-server/
├── src/
│ ├── index.ts # stdio entry point (for local MCP clients)
│ ├── httpServer.ts # Streamable HTTP entry point (for remote deployment)
│ ├── registerTools.ts # tool definitions, shared by both entry points
│ ├── scopusClient.ts # Elsevier API client: requests, normalization, error mapping
│ ├── types.ts # TypeScript types for raw Scopus responses + normalized output
│ └── logger.ts # structured logger → stderr + logs/scopus-mcp.log
├── test/
│ └── test-connection.ts # standalone connectivity test (bypasses the MCP protocol)
├── logs/ # log file written here at runtime (gitignored)
├── .env.example
├── package.json
└── tsconfig.jsonПредварительные требования
Node.js 18 или новее (использует встроенный глобальный
fetch). Проверьте с помощьюnode -v.Ключ Scopus API. Зарегистрируйте бесплатный ключ на Elsevier Developer Portal. Обратите вниманиe: Elsevier ограничивает доступ к полным текстам/аннотациям по диапазону IP (институционалная подписка) или Institutional Token — одного ключа достасточно для проверки подключения и базового поиска, но некоторые поля могут быть ограничены в зависимости от ваших прав.
Setup
cd mcp-server
npm install
cp .env.example .envОтредактируйте .env и укажите свой ключ:
SCOPUS_API_KEY=your_real_key_hereSCOPUS_API_KEY считывается из окружения при запуске (src/scopusClient.ts); он никогда не зашит в коде, а .env находится в .gitignore, чтобы его нельзя было случайно закоммитить.
Переменные окружения
Variable | Required | Default | Purpose |
| ✅ | — | Ваш ключ Elsevier Scopus API |
| необязательно | — | Institutional Token, если он нужен вашему ключу для доступа вне кампуса |
| необязательно |
| Переопределение для тестирования через прокси/мок |
| необязательно |
| Таймаут на каждый запрос |
| необязательно |
|
|
| только для HTTP-режима |
| Порт для |
| только для HTTP-режима |
| Адрес привязки для |
| HTTP-режим, настоятельно рекомендуется | — | Если задан, |
| HTTP-режим, необязательно | — | Разрешённый список заголовков |
Сначала проверьте подключение
Прежде чем подключать сервер к какому-либо MCP-клиенту, проверьте, что ключ Scopus API и сетевой путь работают:
npm run test:connectionЭта команда запускает test/test-connection.ts, который вызывает те же клиентские функции, что и инструменты, — но напрямую, без протокола MCP, — с примерным запросом "farmland abandonment Nepal". Вы можете передать свой запрос вмест:
npm run test:connection -- "AUTH(Smith J) AND TITLE(remote sensing)"Он последовательно проходит все три инструмента (поиск → детали → аннотация для первого результата)
и печатает ✅/❌ на каждом шаге, плюс полный журнал запросов/ответов в logs/scopus-mcp.log (см.
Журналирование). Код возврата равен 0, только если все шаги выполнены успешно.
Запуск локально (stdio, для локального MCP-клиента)
npm run dev # runs src/index.ts directly via tsx, no build step
# or
npm run build && npm start # compiles to dist/ then runs the compiled serverСервер общается через stdio, поэтому при прямом запуске в терминале он просто будет ждать JSON-RPC на stdin — это нормально. Его запускает MCP-клиент.
Подключение к Claude Code
claude mcp add scopus --env SCOPUS_API_KEY=your_real_key_here -- node /absolute/path/to/mcp-server/dist/index.js(сначала выполните npm run build, чтобы появился dist/index.js), или добавьте его в .mcp.json проекта:
{
"mcpServers": {
"scopus": {
"command": "node",
"args": ["/absolute/path/to/mcp-server/dist/index.js"],
"env": { "SCOPUS_API_KEY": "your_real_key_here" }
}
}
}Подключение к Claude Desktop
Добавьте тот же блок в claude_desktop_config.json
(%APPDATA%\Claude\claude_desktop_config.json в Windows,
~/Library/Application Support/Claude/claude_desktop_config.json в macOS), затем перезапустите Claude
Desktop:
{
"mcpServers": {
"scopus": {
"command": "node",
"args": ["/absolute/path/to/mcp-server/dist/index.js"],
"env": { "SCOPUS_API_KEY": "your_real_key_here" }
}
}
}Форма ответа
search_scopus пример (сокращён):
{
"query": "farmland abandonment Nepal",
"totalResults": 42,
"returnedResults": 10,
"articles": [
{
"scopusId": "85123456789",
"eid": "2-s2.0-85123456789",
"title": "Drivers of farmland abandonment in the mid-hills of Nepal",
"authors": ["Sharma B.", "Poudel K."],
"publicationYear": 2021,
"sourceTitle": "Land Use Policy",
"doi": "10.1016/j.landusepol.2021.105123",
"doiUrl": "https://doi.org/10.1016/j.landusepol.2021.105123",
"scopusUrl": "https://www.scopus.com/inward/record.uri?...",
"citedByCount": 17,
"abstract": null,
"documentType": "Article"
}
]
}get_article_details добавляет keywords, subjectAreas, openAccess и aggregationType поверх
тех же полей. get_article_abstract возвращат { scopusId, title, abstract, hasAbstract }.
Поля, которых нет в Scopus для данной записи, возвращатся как null (или [] для списковых полей, или
hasAbstract: false), а не опускатся — проверяйте null/false, прежде чем считать, что поле
отсутствует из-за ошибки.
Обработка ошибок
Каждый инструмент ловит ошибки внутренне и возвращат isError: true со структурированным JSON-телом
вместо краша MCP-подключения:
{
"error": true,
"kind": "rate_limited",
"message": "Scopus API rate limit exceeded (HTTP 429) for search_scopus(...). Retry after 30s.",
"status": 429,
"retryAfterSeconds": 30
}kind принимает одно из значений: unauthorized (неверный/отсутствующий ключ API), rate_limited (HTTP 429),
not_found (неверный Scopus ID / HTTP 404), bad_request (пустой запрос, некорректные входные данные),
network_error (сбой DNS/подключения), timeout (превышен SCOPUS_REQUEST_TIMEOUT_MS) или
unknown. Поиск, который выполняется успешно, но ничего не находит, не является ошибкой — он возвращает
totalResults: 0 и понятное человеку message с подсказкой, как расширить запрос.
Журналирование
Все вызовы API и ответы журналируются для отладки:
Каждый запрос журналирует свой URL (ключ API скрыт) перед отправкой.
Каждый ответ журналирует код состояния, затраченное время и превью тела из 500 символов.
Журналы идут в stderr в виде однострочного JSON (никогда в stdout — stdout зарезервирован для протокола MCP на stdio-транспорте), а также дописываются в
logs/scopus-mcp.log.Установите
LOG_LEVEL=debugдля большей детализации илиLOG_LEVEL=error, чтобы уменьшить количество вывода.
Развёртывание на удалённой/серверless-платформе (Render, Railway и др.)
Транспорт stdio (src/index.ts) работает только с MCP-клиентами, которые могут запускать локальный процес —
по сети к нему обратиться нельзя. Чтобы развернуть этот сервер удалённо, используйте вместo входную точку Streamable HTTP:
src/httpServer.ts. Она обслуживает те же три инструмента на POST /mcp и добавляет
GET /healthz эндпоинт для проверок здоровья платформы.
Ни Render, ни Railway не являются по-настоящему "serverless" (нет масштабирования до нуля и холодных стартов посреди запроса) — оба запускают это как обычный постоянный процес Node, что и нужно такому протоколу с состоянием, как MCP. Считайте "serverless-платформу" здесь "управляемым хостингом Node".
Render
Запуштите этот репозиторий (или только папку
mcp-server/) на GitHub.В панели Render: New → Web Service, подключите репозиторий, установите root directory в
mcp-server, если это подпапка более крупного репозитория.Build command:
npm install && npm run buildStart command:
npm run start:httpВ разделе Environment добавьте:
SCOPUS_API_KEY= ваш ключ (пометь его как секрет)MCP_HTTP_AUTH_TOKEN= длинная случайная строка, которую вы генерируете (например,openssl rand -hex 32)по желанию
MCP_ALLOWED_HOSTS= имя вашего хоста Render, напримерscopus-mcp.onrender.com
Render установит
PORTавотомотически —httpServer.tsчитает его, никаких действй не нужно.Разверните. Путь для проверки здоровя:
/healthz.
Railway
New Project → Deploy from GitHub repo, при необходимости укажите корневой католог сервиса
mcp-server.Railway авотомотически определяет Node; если он не запускает нужную команду, укажите:
Build command:
npm install && npm run buildStart command:
npm run start:http
В Variables добавьте
SCOPUS_API_KEYиMCP_HTTP_AUTH_TOKEN, как выше.Railway авотомотически внедряет
PORT.После развёртывания ваш MCP-эндпоинт:
https://<your-app>.up.railway.app/mcp.
Подключение MCP-клиента к развернутом серверу
claude mcp add --transport http scopus https://<your-app>/mcp \
--header "Authorization: Bearer <your MCP_HTTP_AUTH_TOKEN>"Заметки по безопасности для HTTP-развёртывания
Всегда устанавливайте
MCP_HTTP_AUTH_TOKEN. Без него любой, у кого есть URL, сможет вызывать ваши инструменты и расходовать квоту Scopus API — сервер журналирует предупреждение при запуске, если он не установлен.Сервер авотомотически включатет защиту от DNS-rebinding для
localhost/127.0.0.1; для настоящего0.0.0.0развёртывания укажитеMCP_ALLOWED_HOSTS= имя хоста вашей платформы.Ротируйте
SCOPUS_API_KEYиMCP_HTTP_AUTH_TOKENчерез менеджер секретов платформы, никогда не коммитя их в репозиторий.Рассмотрите возможность разместить перед сервисом собственный лимит запросов платформы / обратный прокси для публичных развёртываний, в дополнение к собственным лимитам Elsevier на ключ.
Устранение неполадок
Симптом | Вероятная причина |
|
|
| Неверный ключ, или у ключа нет прав Scopus Search, или отсутствует |
| Достигнут лимит скорсти/квоты Elsevier для ключа — отступите и повторите через |
|
|
| Нет доступа в интернет с этой машины/хоста, корпоративный прокси блокирут |
Вызовы инструментов молча ничего не делают в stdio-клиенте | Что-то записало в stdout — проверьте, что вы не добавили случайный |
Лицензия
MIT
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
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.538MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to search and retrieve real academic papers from Scopus, preventing citation hallucination by providing accurate paper metadata, author info, and citation analysis.3MIT
- FlicenseAqualityDmaintenanceEnables searching and retrieving academic papers, authors, citations, and recommendations from Semantic Scholar via MCP.9
- AlicenseAqualityBmaintenanceEnables AI agents to search and retrieve academic papers, author profiles, and citation data from the Scopus database via MCP tools.7MIT
Related MCP Connectors
Academic research MCP server for paper search, citation checks, graphs, and deep research.
Academic paper search, scientific literature, citation analysis, arXiv & semantic related-work.
Scholarly search: OpenAlex, Crossref, arXiv, OpenCitations and PubMed in one endpoint.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Pratik-Pou/scopus-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server