# preprint-fulltext
English |
简体中文 |
繁體中文 |
한국어 |
Deutsch |
Español |
Français |
Italiano |
日本語
[](https://pypi.org/project/preprint-fulltext/)
[](https://pypi.org/project/preprint-fulltext/)
[](LICENSE)
[](https://github.com/genecell/preprint-fulltext/actions/workflows/test.yml)
Obtén el **texto completo** de preprints de bioRxiv / medRxiv / **arXiv** como datos limpios,
estructurados y listos para *embeddings* — desde una CLI, una biblioteca de Python o un servidor MCP.
`preprint-fulltext` convierte un DOI (o una búsqueda) en secciones estructuradas
(resumen / introducción / métodos / resultados / discusión), un único documento JSON/Markdown,
o un corpus JSONL/Parquet fragmentado y listo para *embeddings* y RAG. El cumplimiento de los
términos de minería de textos y datos (TDM) de openRxiv se aplica de forma estructural, no queda
a criterio del usuario.
> **«Listo para *embeddings*» significa que la salida son fragmentos limpios, conscientes de las
> secciones y acotados por tokens — listos para alimentar a *tu* modelo de embeddings. Calcular los
> embeddings es un último paso opcional que tú controlas; esta herramienta no incluye un modelo de embeddings.**
---
## Por qué
El texto completo de los preprints está disperso en canales incompatibles: Europe PMC ofrece
JATS XML para el subconjunto de acceso abierto, los buckets S3 de openRxiv contienen el corpus
`.meca` autoritativo (con pago del solicitante), OpenAlex es un catálogo con búsqueda de texto
completo solo por n-gramas, y los sitios web de bioRxiv/medRxiv renderizan HTML.
`preprint-fulltext` los unifica tras un único modelo de datos canónico y **un único analizador
JATS compartido**, de modo que obtienes la misma salida estructurada sin importar de dónde
provenga el documento.
## Para quién es
- **Investigadores de ML / NLP** que construyen corpus de embeddings o sistemas RAG sobre la
literatura de preprints.
- **Bioinformáticos y laboratorios** que necesitan los métodos/resultados de un artículo como
texto limpio para análisis, extracción o *pipelines* con LLM.
- **Agentes de programación** (vía el servidor MCP / `SKILL.md`) que necesitan obtener el texto
completo de un preprint o buscar en la literatura durante una tarea.
- Cualquiera que quiera **las secciones de un preprint a partir de un DOI** sin analizar JATS a
mano ni hacer *scraping* de HTML.
## Texto completo para la ciencia impulsada por IA
Los modelos de lenguaje y los agentes razonan de forma mucho más fiable sobre los **métodos y
resultados** de un artículo que sobre su resumen — la mayoría de las afirmaciones científicas,
protocolos, cantidades y salvedades están en el cuerpo. `preprint-fulltext` entrega ese cuerpo a
Claude, Codex y otros agentes como texto limpio, etiquetado por sección y con etiquetas de
procedencia y licencia, que es el sustrato para un **razonamiento científico fundamentado y la
investigación profunda**:
- **Investigación profunda de la literatura** — leer el texto completo de muchos artículos, no solo resúmenes.
- **Extracción de métodos / protocolos** — obtener procedimientos, parámetros y conjuntos de datos exactos.
- **Verificación de afirmaciones** — contrastar un resultado enunciado con la sección de Resultados real.
- **Reproducibilidad y metaanálisis** — comparar métodos y cifras entre estudios.
- **RAG sobre tu propio corpus** — fragmentos conscientes de las secciones, acotados por tokens y con citas.
Como cada `Section`/`Chunk` lleva su `kind` (métodos / resultados / …), su `source` y su
`license`, un agente puede **citar con precisión** (qué sección de qué artículo/versión) y
mantenerse **dentro de la licencia** mientras razona. El texto completo es recuperación, no
memorización: el modelo fundamenta su razonamiento en la fuente primaria en lugar de recordar un
resumen posiblemente desactualizado.
## Características
- **`get `** — el texto completo de un preprint como JSON o Markdown estructurado.
bioRxiv/medRxiv se enrutan por Europe PMC → S3 (con HTML opcional de reserva); los id de
**arXiv** se enrutan al texto completo LaTeXML de arXiv (HTML nativo → ar5iv). Por defecto la
última versión; `--version` selecciona una.
- **`search` / `discover`** — búsqueda por palabra clave, título, resumen o autor en Europe PMC,
OpenAlex y **arXiv**; descubrimiento por tema/categoría/fecha.
- **`ingest`** — ingesta masiva reanudable e incremental desde los buckets S3 de openRxiv hacia un
corpus fragmentado (JSONL o Parquet) con un manifiesto adjunto.
- **Servidor MCP** — las mismas capacidades como herramientas para agentes de programación.
- **Cumplimiento integrado** — una compuerta de exportación degrada las obras no redistribuibles a
*stubs* de enlace de retorno; las licencias desconocidas se tratan como no redistribuibles (a prueba de fallos).
- **Un único analizador JATS** compartido por las rutas de Europe PMC y S3; fragmentación
consciente de tokens y secciones, con identificadores de fragmento deterministas e idempotentes.
## Instalación
```bash
pip install preprint-fulltext # CLI + Python library + MCP server
pip install "preprint-fulltext[parquet,openalex]" # + Parquet output, pyalex
```
El **servidor MCP viene integrado** — sin instalación extra ni marco MCP de terceros. Es un
servidor stdio JSON-RPC 2.0 pequeño y autónomo, así que `preprint-fulltext-mcp` funciona de
inmediato solo con las dependencias del núcleo.
Configura un correo de contacto para los *polite pools* de Europe PMC / OpenAlex (recomendado), y
una clave de API de OpenAlex si usas OpenAlex (obligatoria en OpenAlex desde el 2026-02-13):
```bash
export CONTACT_EMAIL="you@example.org"
export OPENALEX_API_KEY="..." # only needed for OpenAlex discover/search
```
## Inicio rápido (CLI)
```bash
# Structured full text for one preprint (Europe PMC → S3 router)
preprint-fulltext get 10.1101/2024.01.15.575000 --markdown
# Accepts a DOI, a doi.org URL, or a bioRxiv/medRxiv content URL
preprint-fulltext get https://www.biorxiv.org/content/10.64898/2026.06.13.731750v1.full --html --markdown
# Versions: the DOI resolves to the latest version by default; --version selects one
preprint-fulltext get 10.64898/2026.01.29.702557 --version 1 --source html --markdown
# arXiv: id, arxiv.org URL, or 10.48550/arXiv.* DOI — routed to arXiv LaTeXML full text
preprint-fulltext get arXiv:1706.03762 --markdown
preprint-fulltext get https://arxiv.org/abs/2401.10515 --markdown
# Search: keyword, title, or author (add --source arxiv to search arXiv)
preprint-fulltext search "cortical interneurons" -n 20
preprint-fulltext search "Fezf2" --field title
preprint-fulltext search "Min Dai" --field author
preprint-fulltext search "diffusion model" --field title --source arxiv
# Discover by topic + date window (OpenAlex)
preprint-fulltext discover --query "spatial transcriptomics" --since 2025-01 -n 100
# Bulk corpus from S3 (requester-pays; needs AWS credentials)
preprint-fulltext ingest corpus.jsonl --source s3 --server biorxiv --since 2025-06
# A free, no-AWS corpus of the open-access (CC) subset via Europe PMC
preprint-fulltext ingest corpus.jsonl --source europepmc --query "long covid"
```
`get` emite un documento `FullText` (JSON) o Markdown (`--markdown`). `search` / `discover`
transmiten un `SearchHit` por línea (JSONL). `ingest` escribe un `Chunk` por línea más un
archivo adjunto `_manifest.jsonl` para auditoría y reanudación.
## Flujos de trabajo típicos
**1. Leer los métodos/resultados de un artículo como texto.**
```bash
preprint-fulltext get 10.64898/2026.01.29.702557 --markdown > paper.md
# -> # Title / ## Abstract / ## Introduction / ## Methods / ## Results / ## Discussion
```
**2. Construir un corpus listo para embeddings sobre un tema (gratis, sin AWS).**
```bash
# CC/open-access subset via Europe PMC — one Chunk per JSONL line
preprint-fulltext ingest cortex.jsonl --source europepmc --query "cortical interneurons" -n 500
# cortex.jsonl -> {doi, version, chunk_id, section_kind, text, token_count, license, ...}
# cortex_manifest.jsonl -> one row per preprint (doi, version, license, n_chunks, status)
```
**3. Construir el corpus completo de un mes desde S3 (con pago del solicitante).**
```bash
export AWS_PROFILE=... # needs AWS credentials; ~$0.09/GB
preprint-fulltext ingest 2025-06.jsonl --source s3 --server both --since 2025-06 --format parquet
# resumable: rerun after an interruption and it skips finished preprints (no duplicates)
```
**4. Encontrar artículos por autor o título y luego obtenerlos.**
```bash
preprint-fulltext search "Min Dai" --field author -n 20 > hits.jsonl
preprint-fulltext get "$(head -1 hits.jsonl | python -c 'import sys,json;print(json.load(sys.stdin)["doi"])')" --markdown
```
**5. Dar a un agente de programación acceso a la literatura** — ejecuta `preprint-fulltext-mcp` y
apunta tu agente hacia él (consulta [`skills/preprint-fulltext/SKILL.md`](skills/preprint-fulltext/SKILL.md)).
## Python
```python
from preprint_fulltext.pipeline.router import Router
result = Router().get_fulltext("10.1101/2024.01.15.575000")
if result.fulltext:
for section in result.fulltext.sections:
print(section.kind, section.title)
from preprint_fulltext.core.chunk import chunk_fulltext
chunks = chunk_fulltext(result.fulltext) # embedding-ready Chunk records
```
## Servidor MCP
Da a un agente de programación acceso en vivo a los preprints. El servidor expone cuatro
herramientas — `search_preprints`, `get_fulltext`, `get_metadata`, `resolve` — por stdio.
(La ingesta masiva `ingest` **no** es una herramienta a propósito: es de larga duración e incurre
en costes de pago del solicitante.)
`mcp-name: io.github.genecell/preprint-fulltext`
Es un servidor **stdio local**, por lo que funciona en Claude Code / Cursor / VS Code / Windsurf /
Zed / Codex / Cline — pero no en la aplicación web claude.ai (allí, usa el
[Skill](skills/preprint-fulltext/SKILL.md) en su lugar).
### Recomendado: ejecutar con `uvx` (sin instalación)
[uv](https://docs.astral.sh/uv/) ejecuta el paquete publicado bajo demanda — no hay nada que
`pip install` ni que mantener en el PATH. Instala uv una vez:
```bash
curl -LsSf https://astral.sh/uv/install.sh | sh # macOS / Linux
# or: pipx install uv | pip install --user uv | brew install uv | winget install astral-sh.uv
```
El comando de arranque es `uvx --from preprint-fulltext preprint-fulltext-mcp` (el `--from` es
necesario porque el comando de ejecución difiere del nombre del paquete). El primer arranque
descarga el paquete (~30 s); los siguientes usan la caché.
Claude Code — clave mcpServers
```bash
claude mcp add preprint-fulltext --scope user -- uvx --from preprint-fulltext preprint-fulltext-mcp
# uvx not on PATH? use its absolute path:
claude mcp add preprint-fulltext --scope user -- "$(which uvx)" --from preprint-fulltext preprint-fulltext-mcp
claude mcp get preprint-fulltext # verify → Status: ✔ Connected
```
O edita `~/.claude.json` (usuario) / el `.mcp.json` del proyecto:
```json
{ "mcpServers": { "preprint-fulltext": {
"command": "uvx",
"args": ["--from", "preprint-fulltext", "preprint-fulltext-mcp"],
"env": { "CONTACT_EMAIL": "you@example.org" }
} } }
```
Cursor / Windsurf / Cline / Continue — clave mcpServers (misma forma)
Cursor: `~/.cursor/mcp.json` (global) o `.cursor/mcp.json` (proyecto). Windsurf:
`~/.codeium/windsurf/mcp_config.json`. Cline: *MCP Servers → Configure*. Continue:
`~/.continue/config`.
```json
{ "mcpServers": { "preprint-fulltext": {
"command": "uvx",
"args": ["--from", "preprint-fulltext", "preprint-fulltext-mcp"],
"env": { "CONTACT_EMAIL": "you@example.org" }
} } }
```
VS Code (GitHub Copilot, modo Agente) — clave servers + type
`.vscode/mcp.json` (del espacio de trabajo) o el `settings.json` de usuario bajo `"mcp"`:
```json
{ "servers": { "preprint-fulltext": {
"type": "stdio",
"command": "uvx",
"args": ["--from", "preprint-fulltext", "preprint-fulltext-mcp"]
} } }
```
O de una sola vez: `code --add-mcp '{"name":"preprint-fulltext","command":"uvx","args":["--from","preprint-fulltext","preprint-fulltext-mcp"]}'`
Zed — clave context_servers (forma diferente)
`~/.config/zed/settings.json`:
```json
{ "context_servers": { "preprint-fulltext": {
"source": "custom",
"command": "uvx",
"args": ["--from", "preprint-fulltext", "preprint-fulltext-mcp"],
"env": {}
} } }
```
Codex (OpenAI Codex CLI) — TOML, no JSON
`~/.codex/config.toml`:
```toml
[mcp_servers.preprint-fulltext]
command = "uvx"
args = ["--from", "preprint-fulltext", "preprint-fulltext-mcp"]
# env = { CONTACT_EMAIL = "you@example.org" }
```
O: `codex mcp add preprint-fulltext -- uvx --from preprint-fulltext preprint-fulltext-mcp`
### Alternativa: instalar con pip
Si ya hiciste `pip install preprint-fulltext`, el servidor está en tu PATH como
`preprint-fulltext-mcp` — usa `"command": "preprint-fulltext-mcp"` (sin `args`) en cualquiera de
las configuraciones anteriores.
> **Variables de entorno:** configura `CONTACT_EMAIL` (polite pools de Europe PMC / OpenAlex) y
> `OPENALEX_API_KEY` (solo para búsqueda/descubrimiento en OpenAlex) mediante el bloque `env` de la
> configuración, o en tu shell antes de lanzar el cliente. Consulta
> [`SKILL.md`](skills/preprint-fulltext/SKILL.md) para la referencia completa de herramientas orientada a agentes.
## Fuentes de datos y enrutamiento
| Verbo | Fuente por defecto | Notas |
|-------------|-----------------------|---------------------------------------------------|
| `get` | auto (Europe PMC → S3, o arXiv) | bioRxiv/medRxiv: EPMC (subconjunto CC/OA) → S3 (completo, requiere credenciales AWS), `--html` como reserva opcional. **id de arXiv** → texto completo LaTeXML de arXiv (HTML nativo → ar5iv). |
| `search` | Europe PMC | Ranking de relevancia real; `--source openalex\|arxiv`. |
| `discover` | OpenAlex | Más de 250 M de obras, ubicaciones OA, filtros por tema/fecha; `--source arxiv`. |
| `ingest` | S3 (o Europe PMC) | S3 = corpus completo; Europe PMC = subconjunto CC gratuito. La ingesta masiva de arXiv está fuera de alcance (usa el propio bucket S3 de LaTeX de arXiv). |
## Configuración
Mediante variables de entorno (con el prefijo `PREPRINT_FULLTEXT_` o los nombres simples de abajo),
un archivo `.env`, o un `preprint-fulltext.toml`:
| Ajuste | Por defecto | Propósito |
|---|---|---|
| `CONTACT_EMAIL` | – | Identidad de *polite pool* para Europe PMC / OpenAlex |
| `OPENALEX_API_KEY` | – | Obligatoria en OpenAlex desde el 2026-02-13 |
| `AWS_REGION` | `us-east-1` | Región de los buckets openRxiv con pago del solicitante |
| `PREPRINT_FULLTEXT_CACHE_DIR` | `~/.cache/preprint-fulltext` | Caché con direccionamiento por contenido |
| `PREPRINT_FULLTEXT_CHUNK_TOKENS` | `512` | Máximo de tokens por fragmento |
| `PREPRINT_FULLTEXT_CHUNK_OVERLAP` | `64` | Solapamiento de tokens dentro de una sección |
## Cumplimiento
Los corpus son para la minería de textos y datos del propio operador bajo los términos TDM de
openRxiv. `preprint-fulltext` **no** vuelve a alojar ni redistribuye el texto completo de los
preprints. Cada `FullText`/`Chunk` lleva su licencia; la compuerta de exportación tiene dos modos:
- **analysis** (por defecto): paso directo para tu propia minería.
- **redistribution** (`--redistribution`): las obras cuya licencia permite la redistribución pasan
sin cambios; el resto se degrada a un **stub de enlace de retorno** (metadatos + URL, sin texto
del cuerpo). Las licencias desconocidas/ambiguas se tratan como no redistribuibles.
## Desarrollo
```bash
pip install -e ".[dev]"
pytest # offline suite (HTTP mocked with respx, S3 with moto)
ruff check preprint_fulltext/
```
Las pruebas en vivo son opcionales (acceden a las API públicas reales — Europe PMC, arXiv y la
API JSON de bioRxiv/medRxiv):
```bash
PREPRINT_FULLTEXT_LIVE=1 CONTACT_EMAIL=you@example.org pytest -m live # EPMC / arXiv / medRxiv / versions
PREPRINT_FULLTEXT_LIVE_S3=1 pytest -m live_s3 # requester-pays S3 (small; needs AWS creds)
```
La misma prueba de humo en vivo se ejecuta en CI bajo demanda (Actions → **live-smoke**) y
semanalmente, para detectar cambios en las API externas; el flujo de trabajo `test` por defecto
permanece totalmente sin conexión.
Los documentos para agentes (`AGENTS.md`, `llms.txt`, `.cursor/rules/…`,
`.github/copilot-instructions.md`) se generan a partir de `skills/preprint-fulltext/SKILL.md`:
```bash
python scripts/build_agent_docs.py
```
## Contacto
**Min Dai** — ([Gord Fishell Lab](https://fishelllab.hms.harvard.edu),
Harvard Medical School / Broad Institute). Se agradecen *issues* y *pull requests* en
.
## Licencia
BSD-3-Clause (consulta [`LICENSE`](LICENSE)). Cubre únicamente el **software** — el contenido de
los preprints obtenidos permanece bajo la licencia elegida por su autor.