Papers by Ouroboros Apps

Papers by Ouroboros Apps: Búsqueda de artículos de investigación con citas reales y formato de referencias

Servidor MCP alojado

npx add-mcp 'https://papers-mcp.vercel.app/mcp'

Se instala en Claude Code, Codex, Cursor y más

Documentación

Papers by Ouroboros

Papers es un servidor MCP remoto para estudiantes, investigadores, escritores y clínicos que quieren un asistente para buscar y citar artículos reales. Es una alternativa más ligera e independiente a Consensus, SciSpace y Elicit.

El asistente puede buscar en OpenAlex, Semantic Scholar, PubMed, Crossref y arXiv, abrir un artículo por DOI, PMID o ID de arXiv, ver qué cita un artículo o qué cita ese artículo, y formatear en APA, MLA, Chicago o BibTeX. Cada resultado incluye un enlace de origen y un identificador que provino de una de esas APIs. Si una API no devuelve nada, Papers no devuelve nada. No rellena vacíos con citas inventadas.

  • Endpoint MCP: https://<your-host>/mcp
  • Funciona con ChatGPT, Claude, Gemini, Grok, Cursor y cualquier cliente que hable Streamable HTTP más OAuth 2.1 (registro dinámico de clientes y PKCE)

server.json es el manifiesto del Registro MCP (io.github.LAHutchins91/papers). Su remotes[0].url es un marcador de posición (https://papers-mcp.vercel.app/mcp). Cámbialo al origen que realmente despliegues y establece APP_BASE_URL a ese mismo origen.

Servidor alojado

  • URL del servidor MCP: https://papers-mcp.vercel.app/mcp (Streamable HTTP, inicio de sesión OAuth)
  • Documentación: https://ouroborosapps.com/docs/papers
  • Estado: acceso anticipado. Pega la URL en Claude, Cursor, Grok o el modo desarrollador de ChatGPT.
  • Nombre del registro: io.github.LAHutchins91/papers

Conectar

Deja el ID de cliente y el secreto vacíos para que el cliente pueda registrarse solo.

Cursor, en ~/.cursor/mcp.json o un proyecto .cursor/mcp.json:

{
  "mcpServers": {
    "papers": {
      "url": "https://<your-host>/mcp"
    }
  }
}

Claude Code:

claude mcp add --transport http papers https://<your-host>/mcp

Otros clientes: añade la misma URL y elige OAuth. La pantalla de consentimiento nombra al asistente y al alcance papers. El descubrimiento de herramientas (initialize, tools/list, ping) no requiere un token. Llamar a una herramienta sí lo requiere.

Herramientas

  • search_papers — pregunta o palabras clave, con rango de años opcional, campo, indicador de acceso abierto y fuente (openalex, semantic_scholar, pubmed, crossref, arxiv o all)
  • get_paper — un registro y su resumen, por DOI, PMID, ID de arXiv o ID de trabajo de OpenAlex
  • find_related_papers — cited_by o references para ese identificador
  • format_citation — apa, mla, chicago o bibtex de los metadatos obtenidos

Los títulos se mantienen tal como los escribió la fuente. Los nombres de autores se separan de los nombres mostrados, por lo que partículas como "van" pueden caer en la parte equivocada y merecen una revisión antes de publicar la cita.

Prueba y facturación

Inicia una prueba de 14 días desde la página de cuenta después de conectar un asistente. Stripe Checkout es el único lugar donde se muestra un importe. Los planes mensuales y anuales usan los IDs de precio que configures. Papers no crea productos de Stripe.

Cuando STRIPE_SECRET_KEY, STRIPE_PRICE_MONTHLY y STRIPE_PRICE_YEARLY están todos configurados, las llamadas a herramientas requieren una suscripción de Stripe en estado trialing o active. Cuando no están configurados, GET /health informa billingConfigured: false y un llamante firmado con OAuth puede usar las herramientas. Configura las variables de Stripe antes de exponer un despliegue públicamente.

Almacenamiento

La búsqueda de artículos no tiene estado. Las instantáneas de suscripción y los IDs de código de autorización usados comparten un almacén:

STORAGE_BACKENDComportamiento
memory (predeterminado)Local al proceso. Adecuado para pruebas y un solo proceso de Node. Un segundo proceso aún puede aceptar un código que este proceso ya usó.
fileUn documento JSON en STORAGE_PATH (predeterminado data/accounts.json). Para un solo host de Docker.
blobUn Blob privado de Vercel en STORAGE_BLOB_PATH (predeterminado papers/accounts.json). Úsalo en Vercel para que un código no pueda reproducirse entre instancias. Requiere BLOB_READ_WRITE_TOKEN.

El documento es { accounts, usedCodes }. Cada cuenta es { userId, stripeCustomerId, subscriptionId, subscriptionStatus, currentPeriodEnd, plan, updatedAt }. usedCodes mapea un ID de código de autorización a su caducidad, en segundos Unix. Los IDs caducados se eliminan en cada escritura. Un archivo más antiguo que solo sea un mapa de cuentas aún se lee. No hay un esquema de base de datos separado. Cuando la facturación está configurada, Stripe es la fuente de verdad: un proceso frío busca al cliente por metadata.papers_user_id si falta la instantánea.

Los tokens de acceso OAuth y los registros de clientes son tokens firmados, no filas. Establece AUTH_SIGNING_SECRET en producción para que los tokens sobrevivan a un reinicio. En Vercel, establece STORAGE_BACKEND=blob antes de que el despliegue sea público.

Entorno

VariableRequeridaPropósito
APP_BASE_URLProducciónOrigen público, sin barra final. Emisor OAuth y audiencia MCP.
AUTH_SIGNING_SECRETProducciónSecreto HMAC para tokens OAuth y la cookie de cuenta.
SCHOLARLY_CONTACT_EMAILProducciónDirección mailto en User-Agent y parámetros de grupo educado para OpenAlex, Crossref y PubMed.
SUPPORT_EMAILNoSe muestra en la página de soporte. Recurre a la dirección de contacto académica.
NCBI_API_KEYNoLímite de tasa más alto de PubMed.
SEMANTIC_SCHOLAR_API_KEYNoLímite de tasa más alto de Semantic Scholar. Se envía como x-api-key.
STRIPE_SECRET_KEYPara cobrarClave secreta de Stripe.
STRIPE_PRICE_MONTHLYPara cobrarID de precio mensual existente.
STRIPE_PRICE_YEARLYPara cobrarID de precio anual existente.
STRIPE_WEBHOOK_SECRETPara cobrarSecreto de firma de webhook. Apunta Stripe a POST /billing/webhook.
STORAGE_BACKENDNomemory, file o blob.
STORAGE_PATHNoArchivo JSON usado cuando el backend es file.
STORAGE_BLOB_PATHNoRuta de Blob cuando el backend es blob. Predeterminado a papers/accounts.json.
BLOB_READ_WRITE_TOKENCon blobToken de lectura-escritura para el almacén de Blob de Vercel. El SDK lo lee por sí mismo.
PORTNoPredeterminado a 43127.

No confirmes secretos. Copia lo que necesites en el entorno del host, no en el repositorio.

Ejecutar localmente

npm install
npm run dev

Abre http://127.0.0.1:43127. La salud es GET /health.

npm test
npm run typecheck

Las pruebas llaman a las APIs públicas que no necesitan claves. Stripe no se llama. Semantic Scholar a menudo responde 429 desde espacio IP compartido; la herramienta informa ese límite de tasa y no sustituye un artículo inventado.

Desplegar

Vercel: vercel.json construye api/index.ts y enruta cada ruta a esa función, incluyendo logo.jpg en el paquete de la función. Los archivos del repositorio como /package.json y /src/* no se sirven como archivos estáticos. Configura las variables de entorno anteriores, establece APP_BASE_URL al origen del despliegue, establece STORAGE_BACKEND=blob y actualiza server.json remotes[0].url a https://<that-host>/mcp. Crea el almacén de Blob en el proyecto de Vercel y deja su token de lectura-escritura en BLOB_READ_WRITE_TOKEN. El endpoint de webhook de Stripe es POST /billing/webhook.

Docker:

docker build -t papers-mcp .
docker run --rm -p 43127:43127 -e APP_BASE_URL=http://127.0.0.1:43127 -e AUTH_SIGNING_SECRET=replace-me -e SCHOLARLY_CONTACT_EMAIL=you@example.com papers-mcp

El contenedor escucha en 43127.

Límites de tasa

Las solicitudes se espacian por host: OpenAlex aproximadamente 10/s, Crossref aproximadamente 4/s, PubMed aproximadamente 3/s sin clave NCBI, Semantic Scholar aproximadamente 1/s sin clave y arXiv al menos 3 segundos entre llamadas. Siempre se envía un User-Agent descriptivo. El correo de contacto se incluye solo cuando SCHOLARLY_CONTACT_EMAIL está configurado.

Licencia

MIT. Copyright Lawrence Hutchins. Ver LICENSE.


Más de Ouroboros: https://ouroborosapps.com