Hacker News MCP Server
Integra datos y discusiones en tiempo real de Hacker News en tus aplicaciones y flujos de trabajo.
Documentación
🚀 Servidor MCP de Hacker News
La forma más fácil de incorporar datos y discusiones de Hacker News en tiempo real a tus flujos de trabajo con LLM, agentes o aplicaciones.
¡Convierte Hacker News al instante en una base de conocimiento programable y conversacional para tus agentes y aplicaciones de IA!
✨ ¿Por qué usarlo?
- Plug-and-play: Conecta al instante LLMs, agentes o chatbots a los datos y discusiones en vivo de Hacker News.
- Flexible: Úsalo como herramienta local, API en la nube o microservicio contenerizado.
- Amigable con el lenguaje natural: Los usuarios pueden referirse a historias por título, palabras clave o lenguaje natural ("¿Qué dice la gente sobre la computación cuántica?").
- Prompts enriquecidos: Plantillas de prompt integradas para resúmenes, temas de tendencia, análisis de usuarios y más.
- Listo para producción: Manejo robusto de errores, verificaciones de salud y soporte de despliegue en la nube incluidos.
🌟 Características
- ⚡ Múltiples modos de transporte: STDIO/MCP y SSE/MCP para una integración flexible con LLM/agentes
- 🌐 Endpoints REST/OpenAPI: Acceso HTTP directo con documentación autogenerada
- 📰 Cobertura completa de Hacker News: Accede a historias, comentarios, usuarios, temas de tendencia y más
- 🛡️ Manejo robusto de errores: Modelos de respuesta y códigos de estado claros
- 🧩 Configuración fácil: Variables de entorno para claves API, host y registro
- 🐳 Listo para contenedores: Docker y Docker Compose para un despliegue sin complicaciones
- ❤️ Monitoreo de salud: Endpoint de verificación de salud integrado
- 🔒 Soporte CORS: Orígenes seguros y configurables para integración web
📚 Endpoints de API
Todos los endpoints están disponibles por defecto en http://localhost:8000 (o el host/puerto que configures).
🔎 Endpoints de API REST
Historias
GET /api/stories/top?limit=30— Obtener historias principalesGET /api/stories/best?limit=30— Obtener mejores historiasGET /api/stories/new?limit=30— Obtener historias más recientesGET /api/stories/ask?limit=30— Obtener historias de Ask HNGET /api/stories/show?limit=30— Obtener historias de Show HNGET /api/stories/search?query=YOUR_QUERY&limit=5— Buscar historias por título o palabras claveGET /api/stories/by-date?days_ago=1&limit=30— Obtener historias de hace N días
Detalles de historias
GET /api/item/{item_id}— Obtener un elemento de Hacker News por IDGET /api/story/by-title?title=YOUR_TITLE— Obtener una historia (y comentarios) por título/palabras claveGET /api/story/{story_id}/comments?comment_limit=10— Obtener una historia y sus comentarios principales
Recuperación de contenido
GET /api/story/{story_id}/content?format=markdown— Obtener el contenido real de la URL de una historiaGET /api/story/content-by-title?title=YOUR_TITLE&format=markdown— Obtener contenido por título de historia- El parámetro
formataceptamarkdown(predeterminado) ojson
- El parámetro
Usuarios
GET /api/user/{username}— Obtener un usuario de Hacker News por nombre de usuario
Sistema y actualizaciones
GET /api/maxitem— Obtener el ID de elemento más grande actualGET /api/updates— Obtener el elemento más reciente y cambios de perfilGET /health— Endpoint de verificación de saludGET /sse-info— Información sobre el endpoint SSE
SSE y MCP
GET /sse— Endpoint de Eventos Enviados por el Servidor (SSE) para el protocolo MCP
OpenAPI y documentación
GET /docs— Interfaz Swagger UI (documentación interactiva de API)GET /openapi.json— Esquema OpenAPI (para integración de herramientas)
🗣️ Consultas por lenguaje natural y basadas en título
Puedes buscar y recuperar historias usando lenguaje natural o palabras clave, ¡no solo IDs numéricos!
-
Ejemplo:
GET /api/stories/search?query=quantum computing— Encontrar historias sobre computación cuánticaGET /api/story/by-title?title=React framework— Obtener la historia más reciente y comentarios sobre el framework React
-
Amigable con el lenguaje natural:
- "Cuéntame sobre esa historia de computación cuántica de ayer"
- "¿Cómo es la discusión sobre el nuevo framework React?"
Estas consultas se manejan a través de los endpoints /api/stories/search y /api/story/by-title.
🧑💻 Ejemplo de uso
Buscar historias por título/palabras clave:
curl "http://localhost:8000/api/stories/search?query=AI+ethics&limit=3"
Obtener una historia y sus comentarios por título:
curl "http://localhost:8000/api/story/by-title?title=OpenAI+GPT-4"
Obtener el contenido real de la URL de una historia (como Markdown):
curl "http://localhost:8000/api/story/12345/content?format=markdown"
Obtener contenido por título de historia:
curl "http://localhost:8000/api/story/content-by-title?title=quantum+computing&format=markdown"
Verificación de salud:
curl "http://localhost:8000/health"
Obtener historias principales:
curl "http://localhost:8000/api/stories/top?limit=5"
Consulta /docs para obtener documentación interactiva completa y probar los endpoints en vivo.
👤 ¿Para quién es?
- Desarrolladores de LLM/Agentes de IA: Añade noticias y discusiones del mundo real y actualizadas a tus agentes.
- Creadores de chatbots: Potencia tus bots con historias de tendencia y perspectivas de la comunidad.
- Investigadores y científicos de datos: Analiza tendencias de Hacker News, actividad de usuarios y sentimiento de temas.
- Entusiastas de la productividad: Construye paneles personalizados, bots de notificaciones o herramientas de investigación.
- ¡Cualquiera que quiera hacer Hacker News programable!
ℹ️ Consejo: No necesitas saber los IDs de las historias—¡solo pregunta por historias por título, tema o palabras clave!
⚡ Inicio rápido
🛠️ ¡Instala en segundos, ejecuta en cualquier lugar!
1. Instalación
# Clone the repository
git clone https://github.com/yourusername/hacker-news-mcp.git
cd hacker-news-mcp
# Install dependencies
pip install -r requirements.txt
2. Ejecutar el servidor
# Run with SSE transport (default, good for web/remote)
python run.py --transport sse --host 127.0.0.1 --port 8000
# Run with STDIO transport (for direct LLM/agent integration)
python run.py --transport stdio
# Optional: Run with custom log level
env LOG_LEVEL=debug python run.py --transport sse
3. 🚢 Despliegue con Docker
# Build and run with Docker
docker build -t hacker-news-mcp .
docker run -p 8000:8000 hacker-news-mcp
# Or use Docker Compose
docker-compose up -d
🛠️ Configuración de MCP
💡 Consejo: Funciona con Claude Desktop, Windsurf, Cursor IDE y cualquier LLM/agente que soporte MCP.
🎛️ Ejemplo con Claude Desktop
STDIO (Local):
{
"mcpServers": {
"hackerNews": {
"command": "python",
"args": ["/path/to/hacker-news-mcp/run.py", "--transport", "stdio"],
"env": { "LOG_LEVEL": "info" }
}
}
}
🖥️ Ejemplo con Windsurf/Cursor IDE
STDIO (Local):
{
"mcpServers": {
"hackerNews": {
"command": "python",
"args": ["/path/to/hacker-news-mcp/run.py", "--transport", "stdio"],
"env": { "LOG_LEVEL": "info" }
}
}
}
SSE (Remoto):
{
"mcpServers": {
"hackerNews": {
"url": "https://your-deployed-server.com/sse",
"transport": "sse"
}
}
}
🧰 Herramientas, recursos y prompts
🛠️ Herramientas disponibles
- 🔎 Recuperación básica de datos
get_item(id): Obtener un elemento de Hacker News por IDget_user(id): Obtener un usuario de Hacker News por IDget_max_item_id(): Obtener el ID de elemento más grande actual
- 🏆 Listados de historias
get_top_stories(limit): Obtener historias principalesget_best_stories(limit): Obtener mejores historiasget_new_stories(limit): Obtener historias más recientesget_ask_stories(limit): Obtener historias de Ask HNget_show_stories(limit): Obtener historias de Show HNget_job_stories(limit): Obtener historias de empleo
- 📝 Recuperación de contenido
get_story_content(story_id, format): Obtener el contenido real de la URL de una historiaget_story_content_by_title(title, format): Obtener contenido por título de historia- Opciones de formato:
"markdown"(predeterminado) o"json"
- 💬 Recuperación avanzada de historias
get_story_with_comments(story_id, comment_limit): Obtener una historia con sus comentariosfind_stories_by_title(query, limit): Encontrar historias por título o palabras claveget_story_by_title(title): Encontrar y recuperar una historia por su título o palabras clave con comentarios
- 🔄 Otras herramientas
get_updates(): Obtener el elemento más reciente y cambios de perfilsearch_by_date(days_ago, limit): Buscar historias de aproximadamente N días atrás
📦 Recursos
- 🧑💻 Recursos de elementos
hn://item/{id}: Obtener elemento por IDhn://user/{id}: Obtener usuario por ID
- 📋 Recursos de listados de historias
hn://top/{limit}: Obtener historias principaleshn://best/{limit}: Obtener mejores historiashn://new/{limit}: Obtener historias más recienteshn://ask/{limit}: Obtener historias de Ask HNhn://show/{limit}: Obtener historias de Show HNhn://jobs/{limit}: Obtener historias de empleo
🧠 Plantillas de prompts
💡 Amigable con el lenguaje natural: ¡Los usuarios pueden referirse a historias por título, palabras clave o simplemente hacer preguntas en inglés sencillo!
-
🧠 Enrutador inteligente
hn_router(query): Analiza cualquier consulta relacionada con HN y enruta a las mejores herramientas y enfoque
-
📝 Análisis de historias
hn_story_summary_by_id(story_id): Resumir una historia de Hacker News por IDhn_story_summary_by_title(title): Resumir una historia por título/palabras clavehn_story_comment_analysis(title|id): Analizar comentarios de una historia
-
📰 Recuperación y análisis de contenido
hn_story_content_by_id(story_id): Obtener y analizar el contenido completo del artículo desde la URL de una historiahn_story_content_by_title(title): Obtener y analizar contenido buscando una historia por título/palabras clavehn_content_filter(story_id, filter_type): Extraer tipos específicos de contenido (técnico, código, opiniones, etc.)
-
🔎 Búsqueda avanzada y comparación
hn_advanced_search(query, days, min_score, min_comments): Encontrar historias que coincidan con criterios específicoshn_compare_stories(story_ids): Comparar múltiples historias para identificar similitudes y diferenciashn_multi_source_analysis(query, sources_count): Analizar múltiples fuentes sobre el mismo tema
-
📈 Análisis de tendencias
hn_trending_topics(): Listar temas de tendencia actualeshn_trend_analysis(days, story_type, topic): Analizar tendencias a lo largo del tiempo, opcionalmente enfocado en un tema específico
-
👤 Análisis de usuarios
hn_user_profile_analysis(username): Analizar la actividad e intereses de un usuario
🗣️ Ejemplos de solicitudes de usuarios
- "Resume esa historia de HN sobre computación cuántica"
- "¿Qué está en tendencia en Hacker News hoy?"
- "Cuéntame sobre el usuario de HN 'dang'"
- "Dame un análisis detallado de la discusión sobre la regulación de la IA"
⚡ ¡No necesitas IDs! Solo pregunta de forma natural—este servidor empareja tu solicitud con el prompt y las herramientas adecuadas.
💬 Ejemplos avanzados de prompts
Enrutador inteligente
"What can you tell me about quantum computing discussions on Hacker News?"
El enrutador analiza tu consulta, identifica la intención y recomienda el mejor enfoque usando las herramientas disponibles (por ejemplo, buscar historias de computación cuántica, analizar contenido, comparar perspectivas).
Análisis de múltiples fuentes
"Compare different perspectives on blockchain from Hacker News"
"What are the various opinions about the new MacBook Pro?"
Recupera múltiples fuentes sobre el mismo tema, extrae su contenido y proporciona un análisis completo de diferentes puntos de vista, áreas de acuerdo/desacuerdo y sintetiza perspectivas.
Filtrado de contenido
"Show me just the technical parts of HN story 12345"
"Extract the code examples from that article about Rust"
Recupera el contenido de una historia y lo filtra según necesidades específicas (detalles técnicos, ejemplos de código, opiniones, explicaciones para principiantes, etc.).
Búsqueda avanzada
"Find popular stories about quantum computing with lots of discussion"
"What are the highest-rated AI stories from the past month?"
Realiza una búsqueda avanzada con filtrado por puntuación, número de comentarios y período de tiempo, y luego analiza los resultados.
Análisis de tendencias
"How has discussion about AI changed on HN over the last month?"
"What topics are gaining traction compared to last week?"
Compara historias actuales con datos históricos para identificar temas emergentes, intereses cambiantes y patrones de participación de la comunidad.
Comparación de historias
"Compare HN stories 12345 and 67890"
"What's the difference between those two quantum computing articles?"
Compara múltiples historias para identificar similitudes, diferencias y relaciones entre ellas.
Documentación de API
Cuando se ejecuta con transporte SSE, la documentación de OpenAPI está disponible en:
- Swagger UI:
http://localhost:8000/docs - ReDoc:
http://localhost:8000/redoc - OpenAPI JSON:
http://localhost:8000/openapi.json
Configuración
Variables de entorno
HN_API_KEY: Clave API para Hacker News (si se requiere en el futuro)LOG_LEVEL: Nivel de registro (debug, info, warning, error, critical)FASTMCP_TOOL_ATTEMPT_PARSE_JSON_ARGS: Establecer en 1 para habilitar el análisis JSON para argumentos de herramientas
Despliegue en la nube
Despliegue en Google Cloud Run
- Construir y enviar la imagen Docker
# Build the Docker image
docker build -t gcr.io/your-project-id/hacker-news-mcp .
# Push to Google Container Registry
docker push gcr.io/your-project-id/hacker-news-mcp
- Desplegar en Cloud Run
gcloud run deploy hacker-news-mcp \
--image gcr.io/your-project-id/hacker-news-mcp \
--platform managed \
--region us-central1 \
--allow-unauthenticated \
--memory 512Mi \
--set-env-vars="LOG_LEVEL=info"
- Configurar los consumidores de MCP con la URL de Cloud Run
Después del despliegue, Cloud Run proporcionará una URL como https://hacker-news-mcp-abcdef123-uc.a.run.app. Usa esta URL en tu configuración de MCP:
{
"name": "Hacker News",
"url": "https://hacker-news-mcp-abcdef123-uc.a.run.app/sse",
"transport": "sse"
}
Despliegue en AWS Lambda
- Empaquetar la aplicación
# Create a deployment package
zip -r deployment.zip . -x "*.git*" -x "*.pytest_cache*" -x "__pycache__/*"
- Crear la función Lambda con API Gateway
- Crea una función Lambda en la consola de AWS
- Sube el paquete deployment.zip
- Configura un disparador de API Gateway
- Establece las variables de entorno según sea necesario
- Configurar los consumidores de MCP con la URL de API Gateway
Usa la URL de API Gateway en tu configuración de MCP:
{
"name": "Hacker News",
"url": "https://abcdef123.execute-api.us-east-1.amazonaws.com/prod/sse",
"transport": "sse"
}
Ejemplos de integración
Cliente Python
import asyncio
from fastmcp import Client
from fastmcp.client.transports import SSETransport
import json
async def main():
# Connect to the server
client = Client(SSETransport("http://localhost:8000/sse"))
async with client:
# List available tools
tools = await client.list_tools()
print(f"Available tools: {len(tools)}")
# Get top stories
top_stories = await client.call_tool("get_top_stories", {"limit": 5})
story_ids = json.loads(top_stories[0].text)
print(f"Top stories: {story_ids}")
# Get a specific story
if story_ids:
story_result = await client.call_tool("get_item", {"id": story_ids[0]})
story_data = json.loads(story_result[0].text)
print(f"Story: {story_data.get('title')}")
if __name__ == "__main__":
asyncio.run(main())
Integración STDIO
Para agentes LLM que soporten servidores MCP basados en STDIO:
# Run the server in STDIO mode
python run.py --transport stdio
Pruebas
Ejecutar pruebas
# Run all tests
python -m pytest tests/
# Run specific test file
python -m pytest tests/test_server.py
Pruebas manuales con el cliente de prueba
# Start the server in one terminal
python run.py --transport sse
# Run the test client in another terminal
python test_client.py
Solución de problemas
Problemas comunes
-
Conexión rechazada
- Asegúrate de que el servidor esté ejecutándose y el puerto sea correcto
- Verifica la configuración del firewall
-
Transporte no soportado
- Verifica que estés usando un transporte soportado ("stdio" o "sse")
-
Errores de análisis JSON
- Para LLMs más antiguos, establece
FASTMCP_TOOL_ATTEMPT_PARSE_JSON_ARGS=1
- Para LLMs más antiguos, establece
-
Dependencias faltantes
- Ejecuta
pip install -r requirements.txtpara asegurarte de que todas las dependencias estén instaladas
- Ejecuta
Contribuciones
- Haz un fork del repositorio
- Crea tu rama de características (
git checkout -b feature/amazing-feature) - Haz commit de tus cambios (
git commit -m 'Add some amazing feature') - Haz push a la rama (
git push origin feature/amazing-feature) - Abre una solicitud de extracción (Pull Request)
Licencia
Este proyecto está licenciado bajo la Licencia Pública General Affero de GNU v3.0 (AGPLv3) — consulta el archivo LICENSE para más detalles.
La AGPLv3 es una licencia copyleft que requiere que cualquier persona que distribuya tu código o una obra derivada ponga el código fuente a disposición bajo los mismos términos, y también extiende este requisito a los usuarios que interactúan con el software a través de una red.
ADVERTENCIA DE USO COMERCIAL Si deseas usar o implementar este código de cualquier forma como parte de un servicio monetizado para otros, incluso si no cobras específicamente por el código, necesitas contactarme para obtener permiso (esto significa TÚ Smithery/Glama o cualquier servicio similar), que solo se otorgará tras el pago de la tarifa de licencia correspondiente. No, puede que no estés cobrando por el uso del código en sí, y puede que estés proporcionando la infraestructura, pero estarías usando MI código para facilitar TU servicio. Esa es una dependencia intrínseca que DEBE ser licenciada. PONER DETRÁS DE UN MURO DE PAGO el uso de Software de Código Abierto no es democratizar el software, es restringirlo solo para aquellos que pueden permitirse pagar, lo cual es contrario al espíritu de las Licencias de Código Abierto.
Para cualquier otra persona, ya sea una empresa o un individuo, espero que te sea útil. Disfrútalo.