senseiewok/cf-evidence-loop

Responde una pregunta de investigación sobre fibrosis quística, drepanocitosis o cualquier condición de la misma manera que lo hace un investigador, una fuente pública a la vez, y devuelve registros de evidencia en lugar de respuestas. Úsalo cuando una tarea necesite buscar en PubMed o Europe PMC, encontrar revisiones sistemáticas o Cochrane, verificar si un artículo fue retractado o corregido, listar o inspeccionar estudios de ClinicalTrials.gov, confirmar la fecha de aprobación de un fármaco en EE.UU. o leer una sección de la etiqueta actual, buscar o escanear preprints, leer la clasificación de una variante en ClinVar...

¿Qué es cf-evidence-loop?

Este skill proporciona a un agente de IA un bucle de investigación basado en evidencia que replica el flujo de trabajo de un investigador real: en lugar de ofrecer respuestas directas, se consultan sistemáticamente fuentes públicas autorizadas (PubMed, Europe PMC, ClinicalTrials.gov, openFDA, ClinVar, bioRxiv/medRxiv, Semantic Scholar, Scite, OpenAlex, GeneBe, entre otras). Cada consulta devuelve un registro estructurado que incluye la fuente, la fecha y una declaración explícita de lo que **no** establece, evitando interpretaciones médicas. Soporta múltiples plataformas (Claude Code, Cursor, Codex) al ejecutarse como una CLI de Python con un archivo `catalog.yaml` que controla los hosts permitidos. El skill es útil para tareas que requieren transparencia en el origen de los datos, verificación de citas, extracción de metadatos de publicaciones y ensayos clínicos, y análisis de variantes genéticas, todo bajo estrictas reglas de conducta de red (HTTPS obligatorio, respeto a robots.txt, sin reenvíos en consultas de datos).

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/senseiewok/cf-skills/tree/HEAD/.claude/skills/cf-evidence-loop

Installed? Explore more Investigación y análisis de datos skills: affaan-m/uspto-database, affaan-m/scholar-evaluation, affaan-m/literature-review · View all 6 →

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Bucle de evidencia CF

Un investigador no comienza con una respuesta. Recorre un conjunto fijo de preguntas contra el registro público: qué se publicó, si algo de eso fue retractado, qué hay en ensayos, qué está aprobado y para quién, a cuántas personas concierne, qué recomienda el campo y qué está diciendo el campo en subvenciones y preprints. Este skill le da a un agente ese bucle como una línea de comandos, con una regla: nada regresa sin su fuente, su fecha y lo que no establece.

Investigación, no consejo médico. Los registros que devuelve esta herramienta describen documentos públicos. No interpretan nada para una persona, y el texto de indicación de una etiqueta no es la elegibilidad de ningún individuo.

1. Qué hace este skill

PreguntaComandoFuente
¿Qué se ha publicado sobre esto?pubmed "<término>" [--sort pub_date]PubMed a través de NCBI E-utilities
¿Qué dicen las revisiones sistemáticas y Cochrane?reviews "<término>"Subconjunto de revisión sistemática de PubMed más la revista Cochrane
Buscar con metadatos de acceso abierto y citasepmc '<consulta Europe PMC>'Europe PMC
¿Con qué frecuencia se cita este DOI y es de acceso abierto?cited <DOI>Europe PMC
¿Ha sido retractado o corregido este artículo?retractions <DOI> [<DOI> ...]Crossref, datos de Retraction Watch
¿Qué es este DOI?doi <DOI>Crossref
¿Cuándo aprobó la FDA por primera vez este fármaco?approval <MARCA>openFDA Drugs@FDA
¿Qué dice la etiqueta actual de EE.UU.?label <MARCA> [--sections ...]openFDA label
¿Cuándo autorizó la EMA este medicamento en la UE?ema <FÁRMACO> [--file RUTA]Agencia Europea de Medicamentos (informe JSON descargado sin conexión)
¿Qué ensayos incluyen esta condición?trials "<condición>" [--term X] [--status RECRUITING]ClinicalTrials.gov v2
¿Qué contiene el registro para este ensayo?trial <NCTId>ClinicalTrials.gov v2
¿Qué es este preprint?`preprint <biorxivmedrxiv> `
¿Qué preprints de CF aparecieron en un período?preprints <servidor> <YYYY-MM-DD> <YYYY-MM-DD> [--pattern]bioRxiv / medRxiv
¿Cómo se clasifica esta variante?variants "<consulta ClinVar>"ClinVar a través de NCBI E-utilities
¿A quién financia los NIH sobre este tema?grants "<texto>" [--fy 2025]NIH RePORTER
¿A quién financia UKRI sobre este tema?ukri "<consulta>" [--limit 25]UKRI Gateway to Research (alias: gtr)
¿Cuál es el denominador de población para una región?population <entidad> [--variable Count_Person] [--year YYYY]Google Data Commons
Anotar variante con CADD, ClinVar, SnpEff, frecuencia gnomADmyvariant "<consulta de variante>" [--limit 5]MyVariant.info
Consultar frecuencias alélicas agregadas de gnomAD (rechazado por diseño)gnomad <crom-pos-ref-alt>gnomAD (solo acceso manual; siempre rechazado por la política del catálogo)
¿Qué contiene OpenAlex para este trabajo (citas, retracción, OA)?`openalex <DOIID>`
Buscar trabajos en OpenAlexopenalex-search "<consulta>" [--limit 10]OpenAlex a través de OurResearch (clave requerida)
¿Qué ubicaciones de acceso abierto y metadatos de licencia indexa Unpaywall?unpaywall <DOI>Unpaywall a través de OurResearch
¿Qué grafo de citas y metadatos de artículos tiene Semantic Scholar?s2 <DOI>Semantic Scholar a través de Ai2 (alias: semantic-scholar)
Resolver el rastro completo del artículo (Crossref, Unpaywall OA, citas de Semantic Scholar)paper-trail <DOI>Crossref, Unpaywall, Semantic Scholar (alias: paper)
¿Qué metadatos de compuestos, fase clínica y códigos ATC tiene ChEMBL?`chembl <CHEMBL_IDnombre> [--limit 5]`
¿Qué ensayos de bioactividad cuantitativa (EC50, IC50, Ki, Kd) tiene ChEMBL?`chembl-activity <CHEMBL_IDnombre> [--target CHEMBL4051]`
¿Qué tratabilidad del objetivo, pasivos de seguridad, puntuaciones de enfermedad o estadísticas de FAERS tiene Open Targets?`opentargets <IDconsulta> [--limit 5]`
¿Qué recuentos de citas de apoyo, contraste y mención tiene Scite para este DOI?scite <DOI> [--rest]Scite Pro MCP (scite-mcp) o REST público de cuota cero (--rest, scite-api)
Examinar hasta 500 DOIs por solicitud para recuentos de Smart Citation, retracciones y desglose por sección con costo de cuota ceroscite-batch <DOI...> [--papers] [--sections]REST público de Scite (POST /tallies, POST /papers, POST /tallies/cited-by-sections; costo de cuota 0)
¿Cómo se distribuyen las citas a este DOI entre las secciones de Introducción, Métodos, Resultados y Discusión?scite-sections <DOI>REST público de Scite (GET /tallies/cited-by-sections/{doi} + /tallies/{doi}; costo de cuota 0)
Leer extractos textuales completos y fragmentos de Smart Citation dentro de un artículo específicoscite-excerpts <DOI> "<consulta>" [--limit 5]Scite Pro MCP Modo C (scite-mcp, en cuarentena en <untrusted_data>)
¿Qué artículos relacionados recomienda Scite a partir de un DOI semilla?scite-recommend <DOI> [--limit 5]REST de Socio de Scite (GET /api_partner/recommend-papers/{doi}, limitado a 650/mes por el escudo REST)
Buscar literatura con recuentos de Smart Citation de Scitescite-search "<consulta>" [--limit 5]Scite Pro MCP (scite-mcp, OAuth/clave requerida)
Resolver un PMID de PubMed a un DOI con costo de cuota ceroscite-pmid <PMID>REST público de Scite (GET /papers/resolve-pmid/{pmid}, costo de cuota 0)
Agregar recuentos de Smart Citation en hasta 100 DOIs con costo de cuota ceroscite-aggregate <DOI...>REST público de Scite (POST /tallies/aggregate, costo de cuota 0)
Listar publicaciones citantes y recuentos de citas retractadas para un DOI objetivo con costo de cuota ceroscite-sources <DOI> [--limit 5]REST público de Scite (GET /papers/sources/{target_doi}, costo de cuota 0)
Explorar la red de citas de 1 salto con clasificación de intención y fragmentos en cuarentenascite-graph <DOI> [--direction both] [--limit 5]Scite Pro MCP (citation_graph, en cuarentena en <untrusted_data>)
Leer el cuerpo completo paginado por DOI o PMID`scite-fulltext <DOIPMID> [--offset 0] [--length 8000]`
Buscar en los conjuntos de datos de Evidencia de Scite (UK MHRA, Patentes, 510(k), MAUDE, FAERS, Subvenciones, Fármacos, Ensayos)scite-evidence <conjunto> "<consulta>" [--filter F] [--page 1]Scite Pro MCP (search_mhra, search_patents, search_510k_summaries, etc., en cuarentena en <untrusted_data>)
Normalizar coordenadas de variantes HGVS o SPDI`ncbi-variation <HGVSSPDI>`
Consultar secuencia de proteínas UniProtKB, límites de dominio y variantes naturales`uniprot <ACCESSIONconsulta> [--limit 5]`
Consultar coordenadas genómicas de Ensembl, transcritos canónicos o consecuencias de rsID`ensembl <rsIDENSG
Buscar en NLM DailyMed Etiquetas de Producto Estructuradas (SPL) por nombre de fármacodailymed <FÁRMACO> [--limit 5]Servicios web RESTful de DailyMed v2 (dailymed-web-services)
Leer términos o página legal antes de la entrada del catálogoread-page <HTTPS_URL> [--out ARCHIVO] [--max-chars N]Lectura iniciada por humanos de páginas de términos/política o PDFs bajo reglas de conducta de laboratorio
Buscar deterministicamente el contexto del exón de CFTR RefSeq NM_000492.4 y el dominio de UniProt P13569`cftr-context <variantecodón>`
Buscar deterministicamente la marca del modulador de CFTR, API, código molecular, NDA y contexto de seguridad de advertencia recuadrada de openFDA SPL`cftr-modulator <marcacódigo
Buscar deterministicamente metadatos de la estructura de coordenadas Cryo-EM de CFTRcftr-structure <pdb_id> [--list]Metadatos deterministas de resolución estructural Cryo-EM de CFTR, ligandos, conformación y referencia sin red (alias: cftr-pdb)
¿A qué puede acceder esta herramienta?sourcesel catálogo
¿Qué dicen varias fuentes sobre un fármaco, variante o ensayo?brief drug <MARCA>, brief variant "<consulta ClinVar>", brief trial <NCTId>las fuentes anteriores, verificadas (ver Briefs)
¿Existen todos los DOI, PMID e id de ensayo en esta nota?cite-check <ARCHIVO> [--max-ids 30] [--scite-bulk]Crossref, PubMed, ClinicalTrials.gov, más verificación masiva opcional de Scite de cuota cero (ver Cite-check)

Lo que el código cliente se niega a hacer: alcanzar cualquier host no permitido en catalog.yaml (nunca se sigue una redirección en consultas de datos de API); presentarse como un navegador; omitir verificaciones de certificados; reintentar después de una negativa. Para la lectura de términos previa al catálogo, read-page aplica la estricta conducta de red del laboratorio: solo HTTPS, robots.txt primero a través de robots_allows, Crawl-delay respetado, robots no legible/negado aborta la búsqueda, redirecciones HTTPS del mismo sitio verificadas nuevamente contra robots, verificación de certificados activada, límite de cuerpo de 5 MB, solicitud única. No necesita una entrada de catálogo porque existe específicamente para una lectura iniciada por humanos de páginas de términos antes de que exista una entrada de catálogo, no para extracción de datos. El paquete tampoco llama nunca a un modelo de lenguaje y no consulta ninguna fuente que contenga datos a nivel individual.

2. Ejecútalo

pip install -r scripts/requirements.txt
python scripts/evidence_cli.py retractions 10.1038/ng.2745
python scripts/evidence_cli.py approval TRIKAFTA
python scripts/evidence_cli.py variants "CFTR[gene] AND F508del" --limit 5
python scripts/evidence_cli.py population country/USA
python scripts/evidence_cli.py cftr-context "F508del"
python scripts/evidence_cli.py cftr-context "621+1G->T" --json
python scripts/evidence_cli.py cftr-context "711+1G->T"
python scripts/evidence_cli.py cftr-modulator "Trikafta"
python scripts/evidence_cli.py cftr-modulator "VX-121" --json
python scripts/evidence_cli.py cftr-structure "8EIQ"
python scripts/evidence_cli.py cftr-structure "8EIZ"
python scripts/evidence_cli.py cftr-structure "7SV7"
python scripts/evidence_cli.py cftr-structure "7SVR"
python scripts/evidence_cli.py cftr-structure "6O2P"
python scripts/evidence_cli.py cftr-pdb --list

Banderas en cada comando: --json para un objeto JSON por registro, --ledger RUTA para añadir registros a un libro de evidencia JSONL. Código de salida 0 cuando cada registro es found o not_found; 3 cuando alguno es blocked, rate_limited o error.

Briefs

Un brief hace una pregunta a varias fuentes a través del mismo cliente, por lo que la puerta de catálogo, la regulación de velocidad, el presupuesto y el disyuntor siguen aplicando. Imprime cada registro que cada fuente devolvió, el estado de cada fuente, los campos que comparó y un bloque corto de verificaciones cruzadas.

RecetaEjecutaVerificaciones cruzadas
brief drug TRIKAFTAapproval, label, trials por término (5), pubmed para la marca (5)estado de cada fuente; que el año de vigencia de la etiqueta no sea anterior al año de primera aprobación de Drugs@FDA; escaneo de literatura y retracción de OpenAlex; límite de seguridad del modulador de CFTR (AH-4) y verificación cruzada primaria de PDB
brief variant "CFTR[gene] AND F508del"variants, pubmed para el mismo término (5)estado de cada fuente; cuántos registros de ClinVar coincidieron, con clasificación y estado de revisión para cada uno
brief trial NCT05033080trial, pubmed para el id de NCT (5)estado de cada fuente; el id del registro del ensayo; qué artículos devueltos nombran el ensayo en su título

Cómo leer las verificaciones cruzadas:

  • PASS: los valores coinciden, o la fuente respondió. No es un hallazgo sobre el fármaco, la variante o el ensayo.
  • CHECK: una persona debe revisar. Una fuente no respondió; varios registros de ClinVar coincidieron (todos se listan, ninguno se selecciona); o la fecha de vigencia de la etiqueta es anterior a la primera aprobación del fármaco, lo cual no puede ser correcto, por lo que uno de los dos registros es inconsistente. La fecha de vigencia de una etiqueta es su revisión más reciente, por lo que un año de etiqueta igual o posterior al año de aprobación es esperado y es PASS.
  • NOT STATED: una fuente no proporcionó el valor, por lo que no se comparó nada. Los registros de PubMed no contienen resumen ni texto completo, por lo que un artículo que no nombra el ensayo en su título es NOT STATED, no "no lo menciona".

Lo que un brief no hace: no añade ningún hecho propio. Cada valor que imprime se copia de un campo de registro o es un recuento etiquetado o diferencia de años, y un valor faltante se imprime como not stated. Una fuente bloqueada, limitada por velocidad o fallida no detiene las otras fuentes; se lista con su estado y el código de salida es 3. Con --json, los registros vienen primero y un último objeto, {"brief": ...}, contiene las fuentes, campos, verificaciones cruzadas y pie de página; --ledger almacena solo los registros. Cada brief termina con: Investigación, no consejo médico. Un brief lista documentos públicos; no interpreta nada para una persona.

Cite-check

Cada cita pasa por el registro de evidencia, y una que no se pueda resolver se elimina o se corrige desde una fuente, nunca se repara de memoria. cite-check ARCHIVO lo aplica a una nota completa. Encuentra cada DOI, cada id de PubMed escrito como PMID 123, PMID: 123 o una URL pubmed/123, y cada id de NCT, elimina duplicados (conservando la línea de primera ocurrencia) y busca cada uno con el código de búsqueda única: doi para un DOI, una búsqueda en PubMed en el campo [pmid] para un PMID (dos solicitudes), trial para un id de NCT. El cliente habitual aplica: puerta de catálogo, regulación de velocidad, presupuesto, disyuntor, contabilidad.

LíneaSignificado
PASSLa fuente devolvió un registro; su título y año o fechas se imprimen, not stated donde falten
NOT FOUNDLa fuente respondió que no existe tal id. Elimínalo o corrígelo desde una fuente; nunca adivines
UNRESOLVEDLa búsqueda fue bloqueada, limitada por velocidad o falló. No resuelto no es lo mismo que inexistente
TITLE PASS / TITLE CHECKUna frase citada o enfatizada de cuatro o más palabras en la misma línea comparte al menos 0.6 (o menos) de las palabras del lado más corto con el título del registro, ignorando mayúsculas, puntuación y palabras vacías, y su presencia en el cuerpo ya se ha confirmado (TITLE PASS). De lo contrario, una persona debe verificar (TITLE CHECK).

Regla: nunca reemplazar un PMID o NCT por otro a menos que el doi o trial lo devuelva explícitamente como un reemplazo autorizado. Si doi no puede resolver el DOI, se marca como NOT FOUND o UNRESOLVED; no se adivina. Después de la verificación de citas, se imprime un marcador de fin de nota.

Registro de la sesión

Cada ejecución de evidence_cli.py escribe en stderr un registro plano de cada acción: la fuente, el comando, la hora, el estado y el tiempo transcurrido. --ledger añade los objetos de registro a un archivo JSONL que puede ser una ruta absoluta o relativa (el directorio debe existir). Cuando se usa --json, el objeto JSON de cada registro se imprime en stdout, y --ledger almacena los mismos objetos. Un registro es un dict con claves record, source, retrieved, status, note; record contiene dicts de respuesta y ledger_path contiene la ruta del archivo; los registros en el libro no están anidados. Una sesión que produce al menos un registro de error, bloqueo o límite de velocidad imprime una línea final de resumen.

3. Catálogo (catalog.yaml)

El catálogo es un mapeo de nombres de fuente a entradas de host. Cada entrada contiene:

  • host: el nombre de host al que conectarse (p. ej., eutils.ncbi.nlm.nih.gov). "Resuelve" significa que el código cliente realiza una conexión HTTP con verificación de certificados a esa dirección; cualquier otra cosa es un error de catálogo.
  • policy: el régimen de acceso (ver más abajo).
  • doc_url (opcional): una URL de documentación o página de términos del servicio, que el agente puede usar para comprender los límites.
  • rate_limit (opcional, solo para free): por ejemplo, 3 solicitudes por segundo. El cliente implementa un token bucket.
  • budget (opcional, solo para free): por ejemplo, 10 solicitudes por minuto. Otro token bucket.

Régimen de acceso del catálogo:

PolíticaSignificado
freeSin clave requerida; el cliente respeta rate_limit y budget.
keySe requiere una clave API de esa fuente; el cliente respeta el límite de velocidad y el presupuesto.
refusedEl código cliente se niega a consultar esta fuente; solo se permite si un humano ha leído y aceptado los términos (ver read-page).
prohibitedNo se puede consultar en ningún momento; el cliente produce un error.

El catálogo del dominio CF actual se proporciona en catalog.yaml (consultar la versión más reciente del repositorio). Los hosts que no están en el catálogo no se pueden alcanzar. Esto incluye todos los hosts internos que contienen datos de pacientes, EHRs, bases de datos institucionales.

Reglas de conducta de red

  1. Solo HTTPS. Sin HTTP sin cifrar.
  2. No presentarse como un navegador. El User-Agent de la biblioteca requests es python-requests/X.Y.Z, mostrando que la consulta es automatizada.
  3. Sin tokens de portador, cookies ni huellas digitales de navegador.
  4. Los certificados TLS siempre se verifican.
  5. Sin reintentos automáticos después de un error HTTP 429 (Demasiadas solicitudes), 403 (Prohibido) o 451 (No disponible por razones legales).
  6. Sin caché de paquetes ni reenvío a servidores proxy.
  7. Sin redirecciones: el código cliente no sigue redirecciones HTTP en consultas de datos de API (redirecciones 301/302). Esto evita que el agente acceda accidentalmente a un host fuera del catálogo. Los redireccionamientos solo se permiten en read-page para términos y son validados contra robots.txt.
  8. Límite de tamaño de respuesta: 10 MB para consultas de datos; 5 MB para lecturas de páginas de términos. Se trunca si se excede.
  9. Tiempo de espera: 30 segundos por solicitud.

Leer página (read-page)

El comando read-page es una puerta de enlace para leer páginas de términos o PDFs cuando el agente necesita comprender los términos de servicio de una fuente antes de que esté en el catálogo. Este comando solo se puede ejecutar después de que un humano lo haya iniciado y confirmado explícitamente que ha leído los términos. El comando no agrega ninguna entrada de catálogo; solo devuelve el texto de la página. El agente nunca debe actuar sobre datos de read-page sin confirmación humana.

4. Flujo de trabajo del agente

  1. El usuario pregunta: "¿Cuál es la evidencia más reciente sobre la eficacia de Trikafta en pacientes con F508del?"
  2. El agente interpreta la pregunta como una pregunta de investigación que requiere evidencia de fuentes múltiples.
  3. El agente ejecuta los comandos relevantes en orden, respetando las reglas de velocidad y presupuesto del catálogo.
  4. Cada respuesta se devuelve como un registro JSON estructurado con metadatos de fuente.
  5. El agente presenta los hallazgos al usuario, citando las fuentes y notando cualquier discrepancia o limitación.
  6. El usuario puede solicitar más detalles o un análisis diferente.

5. Consideraciones

  • Este skill no es un consejo médico. No interprete los resultados como un diagnóstico o recomendación de tratamiento.
  • Todas las fuentes son públicas. No se accede a bases de datos internas de pacientes o EHRs.
  • Las limitaciones de velocidad y presupuesto protegen a las fuentes de sobrecarga. El agente debe ser consciente de esto y espaciar las consultas si es necesario.
  • La verificación de citas (cite-check) es una herramienta para verificar la integridad de las referencias en notas o informes generados por el agente. Ayuda a prevenir la alucinación de referencias.
  • Los briefs proporcionan una visión rápida de múltiples fuentes sobre un solo tema, ideal para la investigación inicial.
  • El catálogo (catalog.yaml) es el guardián de qué fuentes se pueden consultar. Cualquier modificación del catálogo requiere aprobación humana.

6. Ejemplos

Aquí hay ejemplos adicionales de flujos de trabajo completos:

Flujo de trabajo de fármaco

# 1. Obtener la fecha de aprobación de Trikafta
python scripts/evidence_cli.py approval TRIKAFTA --json

# 2. Obtener la etiqueta actual
python scripts/evidence_cli.py label TRIKAFTA --sections 1.1,5.1,14 --json

# 3. Buscar ensayos clínicos relacionados
python scripts/evidence_cli.py trials "Trikafta" --status RECRUITING --json

# 4. Buscar literatura en PubMed
python scripts/evidence_cli.py pubmed "Trikafta cystic fibrosis" --limit 5 --json

# 5. Ejecutar un brief para resumir
python scripts/evidence_cli.py brief drug TRIKAFTA --json

Flujo de trabajo de variante

# 1. Buscar la variante F508del en ClinVar
python scripts/evidence_cli.py variants "CFTR[gene] AND F508del" --limit 10 --json

# 2. Obtener contexto estructural de CFTR
python scripts/evidence_cli.py cftr-context "F508del" --json

# 3. Buscar literatura en PubMed
python scripts/evidence_cli.py pubmed "CFTR F508del" --limit 10 --json

# 4. Obtener información del modulador de CFTR
python scripts/evidence_cli.py cftr-modulator "Trikafta" --json

# 5. Ejecutar un brief para resumir
python scripts/evidence_cli.py brief variant "CFTR[gene] AND F508del" --json

7. Integración con MCP (Model Context Protocol)

Este skill está diseñado para integrarse con sistemas de agente que soportan MCP. Los comandos CLI se pueden envolver como herramientas MCP, permitiendo que los agentes los invoquen directamente con argumentos estructurados.

Herramientas MCP expuestas

Cada fila en la tabla anterior corresponde a una herramienta MCP que el agente puede llamar. El servidor MCP traduce la llamada a un comando CLI y devuelve la salida estructurada (JSON).

Esquema de herramientas MCP

Para cada comando, el esquema de la herramienta incluye:

  • name: el nombre del comando (p. ej., pubmed, reviews, variants).
  • description: una breve descripción de lo que hace.
  • inputSchema: un objeto JSON Schema que define los parámetros de entrada (término de búsqueda, DOI, límite, etc.).

Implementación de ejemplo del servidor MCP

# Pseudocódigo de implementación del servidor MCP
from mcp.server import Server, NotificationOptions
from mcp.server.models import InitializationOptions
import mcp.server.stdio
import mcp.types as types

async def handle_call_tool(name: str, arguments: dict) -> list[types.TextContent]:
    import subprocess
    import json

    # Construir el comando CLI a partir de los argumentos
    cmd = ["python", "scripts/evidence_cli.py", name] + [f"{k}={v}" if k.startswith("--") else v for k, v in arguments.items()]
    result = subprocess.run(cmd, capture_output=True, text=True)

    if result.returncode != 0:
        return [types.TextContent(type="text", text=f"Error: {result.stderr}")]

    return [types.TextContent(type="text", text=result.stdout)]

8. Desarrollo y contribución

Configuración del entorno de desarrollo

git clone <repositorio>
cd <directorio>
pip install -r scripts/requirements.txt

Ejecución de pruebas

python -m pytest tests/

Añadiendo nuevas fuentes

  1. Agregar una nueva fila a la tabla en la sección 1.
  2. Implementar el comando CLI en scripts/evidence_cli.py.
  3. Agregar el host al catalog.yaml con la política adecuada.
  4. Agregar la herramienta MCP correspondiente.
  5. Escribir pruebas para la nueva fuente.
  6. Actualizar la documentación.

9. Limitaciones

  • Este skill solo accede a fuentes públicas. No reemplaza la consulta a bases de datos privadas o datos de pacientes.
  • La velocidad y el presupuesto de las consultas pueden limitar el alcance de la investigación.
  • Algunas fuentes pueden requerir claves API (p. ej., OpenAlex), que el usuario debe proporcionar.
  • El skill no interpreta hallazgos; solo recupera y estructura registros.
  • La verificación de citas solo verifica la existencia de los IDs; no verifica la precisión del contenido citado.

10. Preguntas frecuentes

P: ¿Puedo usar este skill con cualquier agente?

R: Sí, siempre que el agente soporte la ejecución de comandos CLI o MCP.

P: ¿Necesito una clave API?

R: Para la mayoría de las fuentes, no. OpenAlex requiere una clave.

P: ¿Qué pasa si una fuente está caída?

R: El cliente marca la consulta como error y continúa con otras fuentes. El código de salida será 3.

P: ¿Puedo usar esto para diagnosticar a un paciente?

R: No. Esta herramienta es para investigación, no para diagnóstico. Los registros no interpretan nada para una persona.

P: ¿Cómo sé si un DOI es válido?

R: Usa cite-check para verificar la existencia de DOIs en una nota.

11. Referencias

Licencia

Este proyecto se proporciona bajo la licencia MIT. Ver el archivo LICENSE para más detalles.

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

Skills relacionados