Scopus MCP Server
Scopus MCP Server
Un servidor MCP que envuelve la API de Elsevier Scopus para que un cliente MCP (Claude Desktop, Claude Code o cualquier otro host MCP) pueda buscar y recuperar artículos académicos publicados, algo útil para la verificación de citas y el análisis de estilo de escritura basado en fuentes reales revisadas por pares.
Herramientas
Herramienta | Entrada | Qué devuelve |
|
| Hasta |
|
| Metadatos completos de un artículo: todo lo anterior más palabras clave del autor, áreas temáticas, indicador de acceso abierto, tipo de agregación |
|
| Solo el texto del resumen de un artículo, más |
Todas las respuestas son JSON estructurado (consulte Forma de la respuesta más abajo). Cada herramienta devuelve un error estructurado y amigable en lugar de lanzar una excepción cuando la API de Scopus no está disponible, está limitada por tasa o recibe un ID incorrecto; consulte Manejo de errores.
Internamente, el servidor llama a dos APIs de Elsevier:
Scopus Search API (
GET /content/search/scopus) — utilizada porsearch_scopus.Abstract Retrieval API (
GET /content/abstract/scopus_id/{id}) — utilizada porget_article_detailsyget_article_abstract, ya que la Search API no devuelve de forma fiable resúmenes completos, recuentos de citas ni palabras clave.
Related MCP server: MCP-scopus
Estructura del proyecto
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.jsonRequisitos previos
Node.js 18 o posterior (utiliza el
fetchglobal integrado). Compruébelo connode -v.Una clave de API de Scopus. Registre una clave gratuita en el Portal para desarrolladores de Elsevier. Tenga en cuenta que Elsevier condiciona el acceso a texto completo/resúmenes según el rango de IP (suscripción institucional) o mediante un Institutional Token; una clave por sí sola es suficiente para probar la conectividad y la búsqueda básica, pero algunos campos pueden estar limitados según sus derechos de acceso.
Configuración
cd mcp-server
npm install
cp .env.example .envEdite .env y establezca su clave:
SCOPUS_API_KEY=your_real_key_hereSCOPUS_API_KEY se lee de las variables de entorno al iniciar (src/scopusClient.ts); nunca está codificada y .env está en .gitignore, por lo que no puede enviarse por accidente.
Variables de entorno
Variable | Obligatoria | Por defecto | Propósito |
| ✅ | — | Su clave de API de Scopus de Elsevier |
| opcional | — | Institutional Token, si su clave necesita uno para acceso fuera del campus |
| opcional |
| Anulación para probar contra un proxy/mock |
| opcional |
| Tiempo de espera por solicitud |
| opcional |
|
|
| Solo modo HTTP |
| Puerto para |
| Solo modo HTTP |
| Dirección de enlace para |
| Modo HTTP, muy recomendado | — | Si se define, |
| Modo HTTP, opcional | — | Lista blanca de encabezados |
Pruebe la conectividad primero
Antes de conectar el servidor a cualquier cliente MCP, verifique que la clave de API de Scopus y la ruta de red funcionan:
npm run test:connectionEsto ejecuta test/test-connection.ts, que llama a las mismas funciones de cliente que usan las herramientas, pero directamente, sin hablar el protocolo MCP, con la consulta de ejemplo "farmland abandonment Nepal". Puede pasar su propia consulta en su lugar:
npm run test:connection -- "AUTH(Smith J) AND TITLE(remote sensing)"Recorre las tres herramientas en secuencia (búsqueda → detalles → resumen del primer resultado) e imprime ✅/❌ en cada paso, además de un registro completo de solicitudes/respuestas en logs/scopus-mcp.log (consulte Registro). El código de salida es 0 solo si todos los pasos se completaron correctamente.
Ejecución local (stdio, para un cliente MCP local)
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 serverEl servidor se comunica a través de stdio, por lo que ejecutarlo directamente en una terminal hará que se quede esperando JSON-RPC en stdin; eso es lo esperado. Está pensado para ser lanzado por un cliente MCP.
Conéctelo a Claude Code
claude mcp add scopus --env SCOPUS_API_KEY=your_real_key_here -- node /absolute/path/to/mcp-server/dist/index.js(ejecute npm run build primero para que exista dist/index.js), o añádalo al .mcp.json de un proyecto:
{
"mcpServers": {
"scopus": {
"command": "node",
"args": ["/absolute/path/to/mcp-server/dist/index.js"],
"env": { "SCOPUS_API_KEY": "your_real_key_here" }
}
}
}Conéctelo a Claude Desktop
Añada el mismo bloque a claude_desktop_config.json (%APPDATA%\Claude\claude_desktop_config.json en Windows, ~/Library/Application Support/Claude/claude_desktop_config.json en macOS) y reinicie Claude Desktop:
{
"mcpServers": {
"scopus": {
"command": "node",
"args": ["/absolute/path/to/mcp-server/dist/index.js"],
"env": { "SCOPUS_API_KEY": "your_real_key_here" }
}
}
}Forma de la respuesta
Ejemplo de search_scopus (truncado):
{
"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 añade keywords, subjectAreas, openAccess y aggregationType además de los mismos campos. get_article_abstract devuelve { scopusId, title, abstract, hasAbstract }.
Los campos que Scopus no tiene para un registro concreto se devuelven como null (o [] para campos de lista, o hasAbstract: false) en lugar de omitirse; compruebe si hay null/false antes de suponer que falta un campo debido a un error.
Manejo de errores
Cada herramienta captura los errores internamente y devuelve isError: true con un cuerpo JSON estructurado en lugar de hacer fallar la conexión 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 es uno de: unauthorized (clave de API incorrecta o ausente), rate_limited (HTTP 429), not_found (ID de Scopus incorrecto / HTTP 404), bad_request (consulta vacía, entrada con formato incorrecto), network_error (fallo de DNS/conexión), timeout (se excedió SCOPUS_REQUEST_TIMEOUT_MS) o unknown. Una búsqueda que tiene éxito pero no encuentra coincidencias no es un error: devuelve totalResults: 0 y un message legible que sugiere cómo ampliar la consulta.
Registro
Todas las llamadas y respuestas de la API se registran para depuración:
Cada solicitud registra su URL (con la clave de API oculta) antes de enviarse.
Cada respuesta registra el código de estado, el tiempo transcurrido y una vista previa de 500 caracteres del cuerpo.
Los registros van a stderr como JSON de una sola línea (nunca a stdout; stdout está reservado para el protocolo MCP en el transporte stdio) y también se añaden a
logs/scopus-mcp.log.Establezca
LOG_LEVEL=debugpara más detalle, oLOG_LEVEL=errorpara reducir el ruido.
Despliegue en una plataforma remota/sin servidor (Render, Railway, etc.)
El transporte stdio (src/index.ts) solo funciona con clientes MCP que puedan ejecutar un proceso local; no es accesible a través de la red. Para alojar este servidor de forma remota, use el punto de entrada Streamable HTTP en su lugar: src/httpServer.ts. Sirve las mismas tres herramientas en POST /mcp y añade un endpoint GET /healthz para las comprobaciones de estado de la plataforma.
Ni Render ni Railway son realmente "sin servidor" (no hay arranques en frío de escala a cero a mitad de solicitud): ambos ejecutan esto como un proceso Node persistente normal, que es lo que necesita un protocolo con estado como MCP. Considere "plataforma sin servidor" aquí como "alojamiento Node gestionado".
Render
Suba este repositorio (o solo la carpeta
mcp-server/) a GitHub.En el panel de Render: Nuevo → Web Service, conecte el repositorio, establezca directorio raíz en
mcp-serversi es una subcarpeta de un repositorio más grande.Comando de compilación:
npm install && npm run buildComando de inicio:
npm run start:httpEn Entorno, añada:
SCOPUS_API_KEY= su clave (márquela como secreta)MCP_HTTP_AUTH_TOKEN= una cadena aleatoria larga que usted genere (p. ej.openssl rand -hex 32)opcionalmente
MCP_ALLOWED_HOSTS= el nombre de host de su instancia de Render, p. ej.scopus-mcp.onrender.com
Render establece
PORTautomáticamente;httpServer.tslo lee, no se necesita ninguna acción.Despliegue. Ruta de comprobación de estado:
/healthz.
Railway
Nuevo proyecto → Desplegar desde repositorio de GitHub, establezca la raíz del servicio en
mcp-serversi es necesario.Railway detecta Node automáticamente; si no ejecuta el comando correcto, establezca:
Comando de compilación:
npm install && npm run buildComando de inicio:
npm run start:http
En Variables, añada
SCOPUS_API_KEYyMCP_HTTP_AUTH_TOKENcomo arriba.Railway inyecta
PORTautomáticamente.Una vez desplegado, su endpoint MCP es
https://<your-app>.up.railway.app/mcp.
Conexión de un cliente MCP al servidor alojado
claude mcp add --transport http scopus https://<your-app>/mcp \
--header "Authorization: Bearer <your MCP_HTTP_AUTH_TOKEN>"Notas de seguridad para el despliegue HTTP
Establezca siempre
MCP_HTTP_AUTH_TOKEN. Sin él, cualquiera que tenga la URL puede llamar a sus herramientas y consumir su cuota de API de Scopus; el servidor registra una advertencia al inicio si no está definido.El servidor activa automáticamente la protección contra la re-vinculación de DNS para
localhost/127.0.0.1; para un despliegue real con0.0.0.0, establezcaMCP_ALLOWED_HOSTSal nombre de host de su plataforma.Rote
SCOPUS_API_KEYyMCP_HTTP_AUTH_TOKENmediante el administrador de secretos de su plataforma, nunca confirmándolos en el repositorio.Considere poner el límite de tasa de la propia plataforma o un proxy inverso delante para despliegues públicos, además de los límites de tasa por clave de Elsevier.
Solución de problemas
Síntoma | Causa probable |
|
|
| Clave inválida, o la clave no tiene derechos de Scopus Search, o falta |
| Se alcanzó el límite de tasa/cuota por clave de Elsevier: deténgase y reintente después de |
| El |
| Sin acceso a Internet desde esta máquina/host, proxy corporativo que bloquea |
Las llamadas a herramientas no hacen nada de forma silenciosa en un cliente stdio | Algo escribió en stdout; compruebe que no ha añadido un |
Licencia
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