whichlib

Ayuda a los agentes de codificación a elegir dependencias con evidencia. Dale una necesidad en palabras simples ("parser de pdf en python") y devuelve repositorios de GitHub clasificados por una puntuación transparente de 0 a 100 (momentum, mantenimiento, descargas de npm/PyPI, licencia) con un veredicto de una línea para cada uno. Herramientas: recommend_repos, compare_repos, trending_repos. Instalación: npx -y whichlib

Documentación

whichlib

El selector de dependencias para agentes de codificación. Pregunta qué librería usar y obtén una respuesta puntuada y verificada en lugar de una suposición.

whichlib es un servidor MCP con tres herramientas (recommend_repos, compare_repos, trending_repos) y un panel gratuito, Fresh Repos, que muestra los repositorios de GitHub con más estrellas creados en el último día, semana y mes. Cada repositorio recibe una puntuación transparente de 0 a 100 basada en impulso, mantenimiento, adopción (estrellas, forks, descargas de npm y PyPI) y licencia, además de un veredicto de una línea.

Inicio rápido

Agentes: consulta servidor MCP a continuación para la instalación en una línea.

Panel:

  1. Clona o descarga este repositorio.
  2. Haz doble clic en whichlib/dashboard/index.html.

Eso es todo. La página es un único archivo HTML que llama a la API de búsqueda de GitHub directamente desde tu navegador. Sin paso de compilación, sin servidor, sin cuenta.

Opcional: pega un token de GitHub en Configuración en la página para aumentar el límite de la API de 10 a 30 solicitudes por minuto. Un token de grano fino sin permisos es suficiente. Permanece en el almacenamiento local de tu navegador.

Lo que obtienes

  • Tres pestañas: Hoy, Esta semana, Este mes. Cada una lista los 100 repositorios con más estrellas creados en ese período.
  • Ordena por cualquier columna: estrellas, estrellas por día, forks, problemas abiertos, fecha de creación, último push, lenguaje, licencia o nombre. Haz clic de nuevo para invertir.
  • Filtra por lenguaje (17 lenguajes) o por texto libre sobre nombre, descripción y temas.
  • La columna de rango siempre muestra el rango de estrellas, así que después de ordenar por forks aún ves dónde se encuentra un repositorio.
  • Los resultados se almacenan en caché en el navegador durante 60 minutos por pestaña y lenguaje.
  • Los temas claro y oscuro siguen la configuración de tu sistema.

Cómo se definen los números

  • Tendencia aquí significa "creado en el período, clasificado por estrellas". Eso es lo que admite la API de búsqueda de GitHub. La propia página de tendencias de GitHub clasifica por estrellas ganadas en el período, lo cual no tiene API pública. Las instantáneas nocturnas en este repositorio harán posible eso más adelante.
  • Descargas no existen para repositorios en GitHub, solo para archivos de lanzamiento. Los forks se muestran como la señal pública más cercana.
  • Estrellas/día es estrellas dividido por la edad del repositorio, con un mínimo de una hora.

Puntuación

Cada repositorio recibe una puntuación de 0 a 100, un nivel y un veredicto de una línea. El desglose siempre se devuelve para que una persona o un agente pueda ver el porqué. El mismo archivo, whichlib/lib/score.js, se ejecuta en el panel y en Node, por lo que los dos nunca pueden discrepar.

PartePesoSeñal
Impulso40%Estrellas ganadas en los últimos 7 días a partir de nuestros recuentos diarios de estrellas (los 1,000 repositorios principales por lenguaje más los nuevos repositorios en tendencia). Sin historial, estrellas por día desde la creación multiplicado por 7, con edad mínima de un día, escalado por la tendencia de descargas de npm/PyPI cuando se conoce (la última semana contra las tres semanas anteriores, limitado a 0.5–2x). Escala logarítmica: 50 a la semana ya es bueno, 5,000 es el máximo.
Mantenimiento25%Días desde el último push: puntuación completa hasta 30 días, cero a 365, lineal entre ambos. Menos 0.2 cuando los problemas abiertos superan una décima parte de las estrellas. Protección de estabilidad: un repositorio con 10k+ estrellas o 100k+ descargas semanales, con push en el último año y no archivado, nunca baja de 0.5 aquí. Uso intenso más silencio es estabilidad, no decadencia.
Adopción25%Con descargas semanales conocidas: 50% estrellas (máx. 100k), 20% forks (máx. 20k), 30% descargas (máx. 1M). De lo contrario, 70% estrellas, 30% forks. Todo en escala logarítmica.
Licencia10%Permisiva 1.0, copyleft débil 0.75, copyleft fuerte 0.5, no reconocida 0.5, ninguna 0.

Niveles: Fuerte 75 y superior, Sólido 50, Vigilar 25, Evitar por debajo de 25. Los nombres se eligen para leerse correctamente tanto para un proyecto de seis semanas como para una librería de seis años. Los repositorios archivados están limitados a 20 y reciben el veredicto "Archivado, evitar." Una licencia faltante siempre se menciona en el veredicto.

Los veredictos se leen como "Rising fast, 10.6k downloads/wk, pushed 2 days ago, MIT", "Gaining steadily, 145M downloads/wk, quiet for 6 months, widely used, BSD-3-CLAUSE" o "Slow growth, no push in 60 days, GPL-3.0".

Descargas

GitHub no tiene recuento de descargas para repositorios, pero los registros de paquetes sí. Después de cada instantánea, el paso de enriquecimiento mapea repositorios de JavaScript y TypeScript a npm y repositorios de Python a PyPI, luego obtiene las descargas de la última semana:

  • Un paquete cuenta como del repositorio solo cuando los metadatos propios del registro enlazan de vuelta a github.com/<owner>/<repo>. Un nombre coincidente por sí solo nunca es suficiente, así que un nuevo repositorio llamado widget no recibe crédito por las descargas de un paquete widget no relacionado.
  • Candidatos probados: <repo> y @<owner>/<repo> en npm, <repo> en PyPI.
  • Los mapeos se almacenan en caché en registry-map.json en la rama data. Los negativos se vuelven a verificar después de 7 días, los positivos se mantienen, las descargas se actualizan diariamente.
  • En la primera ejecución, 63 de 858 repositorios elegibles se mapearon a un paquete. La mayoría de los repositorios con menos de un mes aún no están publicados, lo cual es esperado.

Otros lenguajes (Rust, Go, Java...) se omiten por ahora. Cargo, Go y Maven pueden seguir el mismo patrón.

Advertencia: abierto desde disco, el panel no tiene historial de instantáneas, por lo que el impulso usa el respaldo. Las puntuaciones en la pestaña Hoy son por lo tanto provisionales; el informe y el servidor MCP usan cifras reales de estrellas ganadas una vez que hay dos o más días de instantáneas.

cd whichlib
npm run score      # top 25 repos from the latest snapshot with score and verdict

Servidor MCP

La misma puntuación, servida a agentes de codificación. Tres herramientas sobre stdio:

HerramientaEntradaLo que devuelve
recommend_reposneed en palabras simples, language opcional, limit (1–10, predeterminado 5)Los mejores repositorios para la necesidad, clasificados por ajuste (puntuación × relevancia), con descargas de npm/PyPI y un veredicto cada uno. Los candidatos provienen del orden de relevancia de GitHub, su orden de estrellas y una consulta de temas; consulta "Cómo recommend encuentra y clasifica candidatos" a continuación.
compare_reposrepos: 2–10 nombres como owner/repoLos repositorios lado a lado, mejores primero, mismo desglose.
trending_reposperiod día/semana/mes, language opcional, limit (predeterminado 20), withDownloadsRepositorios con más estrellas creados en el período, puntuados.

Cada resultado lleva texto legible y structuredContent (JSON) con la puntuación, nivel, veredicto, las cuatro subpuntuaciones, banderas, paquetes y descargas.

Requiere Node 22 o más reciente. Instala en Claude Code (-s user lo hace disponible en cada proyecto):

claude mcp add whichlib -s user -- npx -y whichlib

O como un plugin de Claude Code, que añade una habilidad que hace que Claude verifique una librería con whichlib antes de añadirla:

/plugin marketplace add josifb/whichlib
/plugin install whichlib@whichlib

Cursor, Windsurf, Claude Desktop y otros aceptan el mismo comando en su configuración MCP:

{ "mcpServers": { "whichlib": { "command": "npx", "args": ["-y", "whichlib"] } } }

Para ejecutar desde un clon en su lugar: node whichlib/mcp/server.mjs.

Variables de entorno, ambas opcionales:

  • GITHUB_TOKEN eleva los límites de GitHub (búsqueda de 10 a 30 por minuto). Un token de grano fino sin permisos es suficiente. Recommend hace tres búsquedas por llamada, así que sin token permite alrededor de tres recomendaciones por minuto.
  • Historial de estrellas: el impulso usa estrellas reales ganadas por semana para los 1,000 repositorios principales por lenguaje más los nuevos repositorios en tendencia, a partir de recuentos diarios de estrellas en la rama data. Instalado desde npm, el servidor mantiene los últimos 10 días en ~/.whichlib/stars/ y los actualiza en segundo plano como máximo cada 12 horas desde raw.githubusercontent.com (archivos públicos, sin token, nada enviado). WHICHLIB_HISTORY=off desactiva la descarga; los repositorios sin historial recurren a estrellas por día desde la creación. En un clon, npm run pull-data llena whichlib/data/stars en su lugar, y FRESH_REPOS_DATA_DIR apunta a cualquier carpeta de archivos diarios.
  • WHICHLIB_TELEMETRY=off o DO_NOT_TRACK=1 desactiva el conteo de llamadas anónimas. Lo que se cuenta: nombre de la herramienta, un ID de instalación aleatorio, versión, plataforma y versión mayor de Node. Nunca consultas, nombres de repositorios o resultados. El recolector es un pequeño Cloudflare Worker en telemetry/, y sus números agregados son públicos en https://whichlib-telemetry.todorovskijosif.workers.dev/stats.

Pruébalo sin un cliente:

cd whichlib
npm run mcp:smoke   # starts the server over stdio, lists tools, calls each one

Sesgo conocido, reducido: el mantenimiento solía caer a cero a los 90 días sin un push, lo que ponía a httpx (145M descargas semanales, seis meses tranquilos) en "Vigilar". La curva ahora llega hasta un año y la protección de estabilidad mantiene los repositorios ampliamente usados en 0.5 o mejor; httpx aterriza en "Sólido". La cadencia de lanzamientos desde la API de releases de GitHub es la señal adecuada a largo plazo y aún está por llegar.

Evaluación de recomendaciones

mcp/eval/needs.json contiene 20 necesidades ("pdf parser" en Python, "state management" en TypeScript, ...) cada una con un conjunto de respuestas aceptadas que un ingeniero senior consideraría razonables. npm run eval las ejecuta a través de recommend_repos en vivo e informa con qué frecuencia un repositorio aceptado aparece en el rango 1, 3 y 5, para nuestra clasificación y para líneas base construidas desde el mismo grupo de candidatos. Los informes llegan a mcp/eval/results/.

Resultado el 2026-09-27, después de la expansión de consultas (segundo informe en results/):

Clasificaciónhit@1hit@3hit@5MRR
la nuestra (ajuste, ver abajo)75%95%100%0.85
orden de relevancia de GitHub65%80%95%0.76
orden de estrellas45%65%75%0.56
solo puntuación, sin relevancia30%65%70%0.46

El primer informe, antes de la expansión, tenía las mismas tasas de acierto para nuestra clasificación (75 / 95 / 100, MRR 0.86) en un grupo más pequeño. La expansión elevó el recuerdo de 53 a 74 repositorios aceptados en los 20 grupos, nunca menos en ninguna necesidad, y las líneas base cayeron en ese grupo más ruidoso mientras la nuestra se mantuvo. Las reglas de ajuste son lo que mantiene el ruido fuera.

Cómo recommend encuentra y clasifica candidatos

Recuperación, tres búsquedas de GitHub por necesidad:

  1. Búsqueda de texto en el orden de relevancia de GitHub, con sinónimos conocidos combinados con OR (async OR asynchronous runtime), para que las diferencias de vocabulario dejen de ocultar librerías como tokio.
  2. La misma búsqueda de texto en orden de estrellas, para los grandes nombres cuya descripción solo menciona el tema.
  3. Una consulta de temas ordenada por estrellas (topic:cli, topic:image-processing), que saca a la superficie lo que los mantenedores etiquetaron ellos mismos. La palabra principal se usa cuando es específica (pdf, cli, orm) y la frase con guiones cuando es amplia (image-processing, state-management). GitHub rechaza OR entre temas, así que es uno por solicitud.

Los filtros de lenguaje usan familias: JavaScript incluye TypeScript y Python incluye Jupyter, porque muchas librerías se mudaron a TypeScript.

La clave de clasificación es fit = score × relevance:

  • la relevancia es 1.0 en el rango de relevancia 1 de GitHub cayendo a 0.5 en el rango 25, 0.75 cuando se encuentra solo a través de la consulta de temas, 0.4 cuando se encuentra solo en el orden de estrellas;
  • ×0.75 cuando el repositorio nombra el tema solo en sus etiquetas de temas y ×0.5 cuando no aparece en su nombre, descripción o temas (coincidió solo con texto del README);
  • ×0.8 cuando pediste un framework, librería, parser o cliente y el repositorio se lee como una aplicación en lugar de un bloque de construcción.

Tanto score como fit se devuelven, con el rango de relevancia, las fuentes de las que provino el repositorio y las dos señales, para que un agente pueda ver el porqué.

node mcp/eval/inspect.mjs "<need>" [language] [wanted/repo ...] imprime todo el grupo de candidatos para una necesidad con estos valores.

Trabajo de instantáneas nocturnas

whichlib/snapshot/ es un script de Node 22 sin dependencias que almacena los 100 repositorios principales para 3 períodos por 9 lenguajes en whichlib/data/snapshots/YYYY-MM-DD.json. Las instantáneas consecutivas son lo que una puntuación de impulso necesita.

cd whichlib
npm test          # 16 unit tests, no network
npm run snapshot  # about 3 minutes without a token, 1 minute with GITHUB_TOKEN

Un flujo de trabajo de GitHub Actions (.github/workflows/snapshot.yml) ejecuta el trabajo todos los días a las 06:17 UTC y confirma el resultado en la rama data, para que el historial se acumule sin inflar main. Actívalo manualmente desde la pestaña Actions o con gh workflow run snapshot. Descarga los archivos localmente con:

cd whichlib
npm run pull-data  # copies new snapshots from origin/data into data/snapshots/
npm run score      # now with real 7-day stars gained once there are 2+ days

Una alternativa del Programador de tareas de Windows está en whichlib/README.md.

Estructura del repositorio

whichlib/             the npm package: MCP server, score, dashboard, jobs, eval, tests
whichlib/dashboard/   Fresh Repos, one HTML file
whichlib/lib/         score.js, shared by browser and Node
whichlib/mcp/         MCP server: recommend_repos, compare_repos, trending_repos
whichlib/snapshot/    snapshot job, enrichment, history builder, score report
whichlib/server.json  MCP registry manifest
telemetry/            call counter: Cloudflare Worker + Analytics Engine
RELEASING.md          release steps

Hoja de ruta

  1. Hecho: panel de control, instantáneas nocturnas, puntuación transparente con niveles y veredictos, descargas de npm y PyPI, servidor MCP con herramientas de recomendación, comparación y tendencias.
  2. Nombrado whichlib. La forma del paquete, server.json para el registro MCP y el contador de llamadas están listos; queda: implementar el contador, hacer el repositorio público, npm publish, mcp-publisher publish, listar en el mercado de plugins de Claude Code y en las listas awesome-mcp.
  3. Luego esperar cuatro semanas y leer las instalaciones activas semanales y las llamadas por instalación. Eso decide si se construye el nivel de equipo con reglas de políticas.
  4. Después: adopción de Cargo, Go y Maven; cadencia de lanzamientos en mantenimiento; descargas en el panel de control; ampliar la evaluación más allá de 20 necesidades del uso real.

Licencia

MIT.