Sign inSign up

fastslack/heural-hermes

By fastslack

•Updated about 1 month ago

SNOMED CT server, Argentine edition (May 2026) pre-indexed. REST API + MCP. Ready to run.

Image
Developer tools
Data science
0

464

fastslack/heural-hermes repository overview

⁠Heural Hermes

Servidor de terminología SNOMED CT, autocontenido y listo para producción.

Un solo docker run. La edición argentina completa de SNOMED CT, búsqueda full-text en español y una API REST — sin importaciones, sin dependencias externas, sin configuración.

Docker Hub Image Size SNOMED CT License


⁠Qué es

Integrar terminología SNOMED CT en un sistema de salud suele llevar días de descarga de RF2, importación, indexado y tuning. Heural Hermes empaqueta Hermes⁠ — el motor de terminología clínica de Mark Wardle — dentro de una imagen Docker que ya trae la base SNOMED CT importada, indexada y compactada. La imagen arranca y sirve.

docker run -d -p 8080:8080 fastslack/heural-hermes:v5

Eso es todo lo que hay que hacer.

SNOMED CT preinstaladoEdición Argentina (es-AR) e Internacional (en-US), más de 350.000 conceptos clínicos horneados en la imagen
Búsqueda en españolAutocompletado y matching difuso optimizados para terminología clínica en castellano
Alto rendimientoLucene 10 con Vector API (SIMD) sobre almacenamiento LMDB de baja latencia
Cross-mappingMapeos a CIE-10, Read Codes y OPCS vía refsets de SNOMED CT
ECL v2.2Expression Constraint Language para consultas semánticas sobre la ontología
API REST + MCPHTTP para aplicaciones, y Model Context Protocol nativo para asistentes de IA
AutocontenidaBase embebida — docker pull y listo, sin volúmenes ni imports en tiempo de arranque

⁠Inicio rápido

⁠Desde Docker Hub (recomendado)
docker run -d --name hermes -p 8080:8080 fastslack/heural-hermes:v5

Verificá que responde:

curl "http://localhost:8080/v1/snomed/search?s=diabetes&maxHits=3"
[
  { "id": 2157527011, "conceptId": 405751000, "term": "Diabetes type", "preferredTerm": "Diabetes type" },
  { "id": 3377131000209115, "conceptId": 11530004, "term": "diabetes lábil", "preferredTerm": "Brittle diabetes mellitus" },
  { "id": 1778601012, "conceptId": 399144008, "term": "Bronze diabetes", "preferredTerm": "Bronze diabetes" }
]
⁠Compilando desde el fuente
git clone https://gitlab.com/heural/heural-hermes-service.git
cd heural-hermes-service
docker compose build      # tag: fastslack/heural-hermes:v5
docker compose up -d

⁠API REST

Base: http://localhost:8080

MétodoEndpointDescripción
GET/v1/snomed/search?s=<texto>Búsqueda full-text con autocompletado
GET/v1/snomed/search?s=<texto>&constraint=<ecl>Búsqueda filtrada por ECL
GET/v1/snomed/concepts/:idConcepto por SCTID
GET/v1/snomed/concepts/:id/extendedConcepto con relaciones, padres e inferencias
GET/v1/snomed/concepts/:id/descriptionsDescripciones y sinónimos
GET/v1/snomed/crossmap/:refsetId?code=<code>Cross-map a CIE-10 / Read / OPCS
POST/v1/snomed/eclEvaluar una expresión ECL

Ejemplos

# Buscar un diagnóstico
curl "http://localhost:8080/v1/snomed/search?s=infarto+agudo+de+miocardio"

# Resolver un concepto por ID (73211009 = Diabetes mellitus)
curl "http://localhost:8080/v1/snomed/concepts/73211009"

# Búsqueda restringida por ECL: descendientes de "Diabetes mellitus"
curl "http://localhost:8080/v1/snomed/search?s=diabetes&constraint=<<73211009"

⁠Integración MCP (Model Context Protocol)

Hermes expone MCP⁠ de forma nativa: un asistente de IA puede buscar conceptos, resolver SCTIDs, hacer cross-mapping y evaluar ECL directamente contra la terminología, sin pasar por la API HTTP.

Levantar el servidor MCP

# Vía Docker Compose (perfil dedicado)
docker compose --profile mcp run --rm -i hermes-mcp

# Vía Docker directo
docker run --rm -i fastslack/heural-hermes:v5 /start-mcp.sh

# Local, sin Docker
java --add-modules jdk.incubator.vector \
     --enable-native-access=ALL-UNNAMED \
     -jar data/hermes/hermes.jar --db data/hermes/snomed.db mcp --locale es

Configuración para clientes MCP (Claude Desktop → claude_desktop_config.json; Claude Code → .mcp.json del proyecto):

{
  "mcpServers": {
    "hermes": {
      "command": "docker",
      "args": ["run", "--rm", "-i", "fastslack/heural-hermes:v5", "/start-mcp.sh"]
    }
  }
}

Tools disponibles

ToolDescripción
searchBúsqueda full-text de conceptos
lookupResolución de concepto por SCTID
crossmapCross-mapping a CIE-10, Read Codes, OPCS
eclEvaluación de Expression Constraint Language

⁠Despliegue

El repositorio incluye un docker-compose.yml con la política de reinicio y la red pensadas para producción:

services:
  hermes:
    image: fastslack/heural-hermes:v5   # pull del registry en DEV/PROD
    build:                              # o build local con el mismo tag
      context: ./data/hermes
      args: { hermes_jar: ./hermes.jar, snomed_db: ./snomed.db }
    restart: unless-stopped             # se recupera solo tras reboot/crash del host
    ports: ['8080:8080']
    networks: [elastic_net]

En un servidor que consume la imagen publicada:

docker compose pull hermes
docker compose up -d hermes

El servicio consumidor la alcanza en localhost:8080 desde el host, o en host.docker.internal:8080 desde otro contenedor (p. ej. la API de Heural vía HERMES_URL).


⁠Stack técnico

ComponenteVersión
Hermesv1.4.1515 (Clojure → JAR)
Java RuntimeEclipse Temurin 21.0.12+8 (LTS)
Jetty12.0.31
Lucene10.x con Vector API (SIMD)
LMDBalmacenamiento nativo de baja latencia
Imagen baseeclipse-temurin:21-jre (Ubuntu 24.04 Noble, glibc 2.39)
SNOMED CTArgentina Edition 20260510 (mayo 2026) + International 20260401 (abril 2026)
Localeses-AR (Latin American Spanish), en-US

Flujo de datos: RF2 → import LMDB → index Lucene → snomed.db → Hermes JAR → Jetty HTTP → REST/MCP.


⁠Seguridad

La línea v3+ corre sobre el stack Jetty 12 / Java 21 endurecido, que resuelve las vulnerabilidades reportadas en las bases Jetty 9.4.x anteriores:

  • Jetty 9.4.x → 12.0.31 — elimina CVE-2025-5115, CVE-2024-6763, CVE-2024-8184
  • Logback → 1.5.21 — elimina CVE-2025-11226
  • commons-fileupload removido (reemplazado por la implementación interna de Jetty 12)
  • OpenSSL y libtasn1 parcheados; base OS moderna con glibc 2.39

El servidor expone únicamente lectura de terminología: no persiste datos de pacientes ni acepta escrituras clínicas.


⁠Versiones

TagCambios
v5SNOMED CT Argentina mayo 2026 + International abril 2026; runtime Jetty 12.0.31 / Temurin 21.0.12
v4SNOMED CT Argentina nov 2024
v3Migración a Jetty 12 / Java 21; parches CVE; base Ubuntu 24.04

⁠Licencia

Copyright © 2024 Heural — Creador: Matías Aguirre

Software libre bajo la GNU General Public License v3⁠.

Hermes es desarrollado por Mark Wardle⁠ bajo licencia EPL-2.0. SNOMED CT® es marca registrada de SNOMED International⁠; su uso requiere la licencia de afiliado correspondiente.

Tag summary

Content type

Image

Digest

sha256:3dc07d40d…

Size

1.9 GB

Last updated

about 1 month ago

docker pull fastslack/heural-hermes:v6