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
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 enweb/. 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á:
| Servicio | Descripción |
|---|---|
nginx | Única puerta de entrada externa, por defecto :8080 (WEB_PORT) |
web | Frontend Next.js: SPA del panel de administración en /admin |
app | Servidor MCP Node + API REST del panel de administración (node dist/server.js; solo en red interna, sin puerto expuesto al host) |
admin-worker | Ejecutor de trabajos en segundo plano (todas las importaciones y trabajos de incrustación, node dist/admin/adminWorker.js) |
postgres | PostgreSQL 16 + pgvector |
pgbouncer | Pool de conexiones (modo transacción) |
redis | Caché de respuestas |
minio + minio-init | Almacenamiento de objetos de activos de medicamentos |
Importante: el contenedor
appno expone el puerto 8000 al host, todo el tráfico debe pasar por nginx. Use siemprehttp://<host>:8080(o suWEB_PORTconfigurado).
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).
-
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_secretDespués de reiniciar (
docker compose up -d), inicie sesión enhttp://<host>:8080/admin. -
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.
- Requiere cargar archivos fuente (cargue en Sources / Modules y luego importe): ICD-10-CM/PCS, LOINC, SNOMED CT, RxNorm, FHIR IG (
-
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 enadmin.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
| Grupo | Herramientas |
|---|---|
| ICD-10 | search_medical_codes, infer_complications, get_nearby_codes, check_medical_conflict, browse_icd_category |
| Medicamentos / TFDA | search_drug, identify_unknown_pill, get_drug_details, get_drug_asset_links |
| Laboratorio / LOINC | search_loinc, query_loinc, interpret_lab_result, batch_interpret_lab_results |
| SNOMED CT | search_snomed_concept, query_snomed_concept, get_snomed_relationships, query_snomed_mapping |
| FHIR Condition | query_fhir_condition, validate_fhir_condition |
| FHIR Medication | query_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 salud | search_health_supplements |
| Nutrición alimentaria | query_food_nutrition, query_food_ingredient, search_foods_by_nutrient, analyze_meal_nutrition |
| Servidor FHIR | list_fhir_servers, get_fhir_server_status, crud_fhir_server |
| Sistema | health_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_serverpuede 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 incluyeconfirm_write=true.
Conexión de clientes
Ambas interfaces se proporcionan a través de la puerta de entrada nginx (por defecto :8080):
| Interfaz | Endpoint | Clientes aplicables |
|---|---|---|
| MCP (streamable-http) | http://<host>:8080/mcp | Clientes MCP nativos (Claude Desktop, conexión MCP de Open WebUI v0.6.31+, etc.) |
| Puente OpenAPI | GET 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