Taiwan-Health-MCP

Un servidor del Protocolo de Contexto de Modelo (MCP) que expone conjuntos de datos de atención médica de Taiwán, como ICD-10 e información sobre medicamentos, para agentes de IA.

Documentación

Servidor MCP de Salud de Taiwán

Servidor MCP de integración de datos de salud de Taiwán Integra ICD-10-CM/PCS, SNOMED CT, LOINC, medicamentos de la FDA de Taiwán / suplementos de salud / nutrición alimentaria, y herramientas de autorización y validación de FHIR R4 IG

FHIR Node.js TypeScript MCP SDK License

Servidor Node.js construido con el SDK oficial de TypeScript MCP (@modelcontextprotocol/sdk), que expone 49 herramientas en 11 grupos de herramientas. Diseñado para despliegues SaaS de producción de alto rendimiento.

Entorno de ejecución del backend: todo el backend (servidor MCP, API REST del panel de administración, trabajadores en segundo plano, todos los cargadores de datos) está en Node.js / TypeScript, con el código en node-server/. El frontend (SPA del panel de administración) es Next.js, ubicado en web/. Este proyecto ya no tiene dependencias de ejecución de Python. Las páginas públicas y legales (/, /status, /privacy, /dpa) se han movido fuera de este proyecto y ahora las proporciona un sitio web promocional independiente.

Características del proyecto

  • Datos localizados de Taiwán: medicamentos de la FDA de Taiwán (incluidos prospectos / apariencia / análisis OCR + LLM), suplementos de salud, nutrición alimentaria, TWCore IG.
  • Soporte de terminología internacional: ICD-10-CM/PCS 2025, SNOMED CT International, LOINC 2.80, FHIR R4.
  • Herramientas de autorización de FHIR IG: consultas de perfiles / ValueSet de múltiples IG (con ámbito de paquete), validación de terminología, generación y validación de recursos de relleno de esqueleto.
  • Búsqueda semántica / híbrida: basada en modelos de incrustación (por defecto Ollama qwen3-embedding), con retroceso automático a búsqueda por palabras clave cuando no hay incrustaciones.
  • Activación dinámica de herramientas: registra / elimina automáticamente herramientas MCP disponibles según el estado de carga de datos de cada módulo.
  • Panel de administración: Consola de administración opcional (cargar archivos fuente, ejecutar / programar importaciones, gestionar configuraciones y servidores FHIR externos, monitoreo en tiempo real de trabajos en segundo plano).
  • Diseño para despliegue de producción: PostgreSQL 16 (pgvector), pgBouncer, Redis, MinIO, Prometheus, trabajadores en segundo plano, con nginx como única puerta de entrada frontal.

Que una herramienta aparezca como disponible solo significa que los datos fuente se han cargado, no que las incrustaciones estén completas. Verifique los contadores de Embeddings de cada módulo en Admin → Modules; si no están completos, la búsqueda retrocederá o mezclará con keyword/BM25.

Inicio rápido

git clone https://github.com/healthymind-tech/Taiwan-Health-MCP.git
cd Taiwan-Health-MCP
cp .env.example .env                          # 設定 POSTGRES_PASSWORD、ADMIN_* 等
docker compose up -d

docker compose up -d iniciará:

ServicioDescripción
nginxÚnica puerta de entrada externa, por defecto :8080 (WEB_PORT)
webFrontend Next.js: SPA del panel de administración en /admin
appServidor MCP Node + API REST del panel de administración (node dist/server.js; solo en red interna, sin puerto expuesto al host)
admin-workerEjecutor de trabajos en segundo plano (todas las importaciones y trabajos de incrustación, node dist/admin/adminWorker.js)
postgresPostgreSQL 16 + pgvector
pgbouncerPool de conexiones (modo transacción)
redisCaché de respuestas
minio + minio-initAlmacenamiento de objetos de activos de medicamentos

Importante: el contenedor app no expone el puerto 8000 al host, todo el tráfico debe pasar por nginx. Use siempre http://<host>:8080 (o su WEB_PORT configurado).

Redespliegue después de cambios de código:

docker compose build app web && docker compose up -d --no-deps app web

Carga de datos (a través del panel de administración)

La importación de datos se activa desde la Consola de administración y la ejecuta admin-worker en segundo plano (no hay un contenedor CLI independiente de cargador de datos).

  1. Habilite el panel de administración en .env:

    ADMIN_ENABLED=true
    ADMIN_USERNAME=admin
    # 產生密碼雜湊(Node;本專案已無 Python 相依):
    #   node -e "console.log('sha256$' + require('crypto').createHash('sha256').update('change-me').digest('hex'))"
    # ⚠️ 在 .env 中,每個 $ 都要寫成 $$(Docker Compose 會把 $ 當變數展開,
    #    當雜湊值以字母開頭時會被靜默截斷)。Compose 會把 $$ 還原成單一 $。
    ADMIN_PASSWORD_HASH=sha256$$...
    ADMIN_SESSION_SECRET=change_this_admin_session_secret
    

    Después de reiniciar (docker compose up -d), inicie sesión en http://<host>:8080/admin.

  2. En la pestaña Modules, importe datos por módulo:

    • Requiere cargar archivos fuente (cargue en Sources / Modules y luego importe): ICD-10-CM/PCS, LOINC, SNOMED CT, RxNorm, FHIR IG (package.tgz).
    • Obtenidos automáticamente por API (importe directamente o configure programación): medicamentos (TFDA, tres fases: índice → rastreo enriquecido → análisis OCR/LLM), suplementos de salud, nutrición alimentaria.
  3. Las incrustaciones (búsqueda semántica) son un trabajo independiente de *_embed, que se puede ejecutar desde la página de cada módulo. Los endpoints de LLM de incrustación / OCR / análisis se configuran en la pestaña Settings (almacenados en admin.llm_profiles, no mediante variables de entorno).

El progreso de la importación, la línea de tiempo de pasos y los registros en tiempo real se pueden ver en la pestaña Tasks. Consulte la documentación del panel de administración y trabajos en segundo plano y programación.

Grupos de herramientas

GrupoHerramientas
ICD-10search_medical_codes, infer_complications, get_nearby_codes, check_medical_conflict, browse_icd_category
Medicamentos / TFDAsearch_drug, identify_unknown_pill, get_drug_details, get_drug_asset_links
Laboratorio / LOINCsearch_loinc, query_loinc, interpret_lab_result, batch_interpret_lab_results
SNOMED CTsearch_snomed_concept, query_snomed_concept, get_snomed_relationships, query_snomed_mapping
FHIR Conditionquery_fhir_condition, validate_fhir_condition
FHIR Medicationquery_fhir_medication, validate_fhir_medication
FHIR IG (autorización / validación)fhir_list_igs, fhir_get_ig, fhir_list_artifacts, fhir_search_artifacts, fhir_list_resource_profiles, fhir_rank_resource_profiles, fhir_get_profile, fhir_get_profile_elements, fhir_get_valueset, fhir_expand_valueset, fhir_lookup_code, fhir_validate_code, fhir_normalize_code, fhir_resolve_reference, fhir_build_bundle, fhir_validate_resource, fhir_validate_bundle, fhir_get_resource_skeleton, fhir_finalize_resource
Suplementos de saludsearch_health_supplements
Nutrición alimentariaquery_food_nutrition, query_food_ingredient, search_foods_by_nutrient, analyze_meal_nutrition
Servidor FHIRlist_fhir_servers, get_fhir_server_status, crud_fhir_server
Sistemahealth_check

Las herramientas relacionadas con módulos se activan / desactivan automáticamente según el estado de carga de datos; las herramientas de servidor FHIR y sistema están siempre registradas.

Excepto crud_fhir_server, todas las herramientas son de solo lectura. crud_fhir_server puede realizar escrituras (create / update / patch / delete) en servidores FHIR externos registrados por el administrador, y solo si la lista de permitidos de ese servidor lo permite y el llamante incluye confirm_write=true.

Conexión de clientes

Ambas interfaces se proporcionan a través de la puerta de entrada nginx (por defecto :8080):

InterfazEndpointClientes aplicables
MCP (streamable-http)http://<host>:8080/mcpClientes MCP nativos (Claude Desktop, conexión MCP de Open WebUI v0.6.31+, etc.)
Puente OpenAPIGET http://<host>:8080/openapi.json, POST http://<host>:8080/tools/<工具名>Clientes que solo admiten servidores de herramientas OpenAPI (como External Tools / tipo OpenAPI de Open WebUI)

/openapi.json genera dinámicamente la especificación OpenAPI 3.1 según las "herramientas actualmente habilitadas"; cada herramienta corresponde a POST /tools/<工具名>, invocada con un cuerpo JSON como parámetros. El cliente solo necesita completar la URL base http://<host>:8080 y automáticamente obtendrá /openapi.json.

Nota: estas dos interfaces actualmente no tienen autenticación obligatoria (consistente con el diseño existente); al exponerlas públicamente, agregue un proxy inverso o token al frente.

Esquema de base de datos

audit | admin | icd | drug | health_supplements | food_nutrition | loinc | fhir (multi-IG) | snomed | rxnorm

Definición completa en db/schema.sql (aplicada automáticamente en el primer inicio del contenedor PostgreSQL), cambios incrementales en db/migrations/.

Panel de administración (opcional)

Deshabilitado por defecto. Configure ADMIN_ENABLED=true en .env y proporcione ADMIN_USERNAME / ADMIN_PASSWORD_HASH / ADMIN_SESSION_SECRET para acceder en /admin, donde puede cargar archivos fuente, ejecutar y programar importaciones de datos, gestionar configuraciones y servidores FHIR externos, y monitorear trabajos en segundo plano ejecutados por admin-worker. Consulte docs/admin/.

Desarrollo

# 後端(MCP + admin REST + worker)
cd node-server
npm install
npm run build          # tsc -> dist/
npm run typecheck      # tsc --noEmit
npm test               # node --test(node-server/src/**/*.test.ts)

# 前端(管理後台 SPA)
cd web
npm install
npm run build
npm run typecheck

Consulte la guía de desarrollo y la guía de pruebas.

Documentación

Documentación completa en docs/, versión en línea publicada con MkDocs en GitHub Pages (configuración en mkdocs.yml).

Agradecimientos

  • Ministerio de Salud y Bienestar de Taiwán, TFDA
  • Regenstrief Institute (LOINC)
  • SNOMED International
  • National Library of Medicine (RxNorm / UMLS)
  • HL7 International (FHIR)
  • OMS