Odel
MCP AEMPS — CIMA

MCP AEMPS — CIMA

Local
@romanpert1PythonUpdated 3mo ago

MCP server for the Spanish AEMPS CIMA pharmaceutical registry (20,000+ authorised medicines).

mcp-aemps

mcp-aemps

Datos farmacéuticos oficiales, listos para tu agente.
El primer servidor MCP open-source para la industria farmacéutica. 20.000+ medicamentos AEMPS, en tiempo real, regulator-grade.

🇪🇸 Español · 🇬🇧 English

PyPI npm GHCR Python versions
PyPI downloads License CI MCP Registry CIMA API v1.23


Lo que tu agente puede hacer

Conecta tu asistente — Claude, ChatGPT, Gemini, Cursor, Continue, Zed, Junie — al registro oficial AEMPS / CIMA. Sin scrapers. Sin hardcoded snapshots. Sin patient data. Cada respuesta cita endpoint REST oficial y fecha de consulta.

Tú: «¿Qué efectos adversos graves aparecen en la ficha técnica de HUMIRA 40 mgTu agente consulta obtener_medicamentodoc_contenido (sección 4.8 de la FT) → devuelve estructurado, con timestamp y fuente AEMPS.

Tú: «Lista los problemas de suministro vigentes para omeprazol 20 mg cápsulasTu agente llama problemas_suministro_dcpf → devuelve los lotes afectados, fechas previstas de retorno y alternativas terapéuticas equivalentes.

Tú: «¿Qué notas de farmacovigilancia ha publicado AEMPS sobre inhibidores SGLT2 en los últimos 6 meses?» Tu agente filtra listar_notas + recupera obtener_notas → resumen accionable con enlaces oficiales.

Tú: «Dame un equivalente clínico (mismo VMP) para simvastatina 20 mg comprimidos sin lactosa.» Tu agente cruza buscar_vmpp + buscar_en_ficha_tecnica("lactosa") → propone alternativas con autorización AEMPS vigente y excipientes confirmados.

Tú: «¿Qué cambia entre la FT actual de Eliquis y la versión publicada hace 90 días?» Tu agente invoca el prompt curado monitorizar_cambios_cartera → diff por sección sobre la documentación oficial.

10 prompts curados más, cubriendo farmacia comunitaria, hospitalaria, industria y counseling al paciente — listos para invocar como slash-commands en tu cliente MCP.


Instalación en 30 segundos

# Una línea — cualquier cliente MCP detectado se configura automáticamente.
pip install mcp-aemps && mcp-aemps install

¿Sin Python en la máquina? Hay tres alternativas equivalentes:

uvx mcp-aemps install                                                   # zero-install vía uv (recomendado)
docker run -p 8765:8765 ghcr.io/romanpert/mcp-aemps:latest              # contenedor multi-arch
pipx run mcp-aemps install                                              # pipx

Reinicia tu cliente MCP. El servidor aparece como mcp-aemps. Listo.

💡 Sin servidor que mantener. Por defecto los instaladores configuran el cliente para lanzar uvx mcp-aemps@latest stdio bajo demanda — el agente arranca el servidor cuando lo necesita y lo apaga cuando termina. Para despliegues compartidos / multi-tenant ver Despliegue.


Compatibilidad — un comando, 11 clientes

ClienteComandoNotas
Claude Desktopmcp-aemps install claude-desktopAnthropic — stdio por defecto, HTTP via mcp-remote opcional
Claude Codemcp-aemps install claude-codeAnthropic CLI — usa claude mcp add cuando está disponible
Codex CLImcp-aemps install codexOpenAI — ~/.codex/config.toml
Gemini CLImcp-aemps install geminiGoogle — ~/.gemini/settings.json, MCP nativo (v0.4.17+)
VS Codemcp-aemps install vscodeGitHub Copilot Chat MCP — mcp.json dedicado (post-2025)
Cursormcp-aemps install cursor~/.cursor/mcp.json
Windsurfmcp-aemps install windsurfCodeium — ~/.codeium/windsurf/mcp_config.json
Zedmcp-aemps install zedcontext_servers en settings.json
Continue.devmcp-aemps install continueExtensión VS Code / JetBrains — YAML
JetBrains Juniemcp-aemps install jetbrains~/.junie/mcp.json
Antigravitymcp-aemps install antigravityGoogle — IDE agente

Los instaladores son idempotentes (re-ejecuta sin miedo), atómicos (la escritura se completa entera o no se aplica), additive (preservan tus otras entradas), port-aware (leen el puerto real bound por mcp-aemps up), y purgan automáticamente aliases legacy (aemps-cima, etc.) para limpiar instalaciones de versiones antiguas. mcp-aemps install (sin subcomando) configura todos los detectados a la vez.


Por qué mcp-aemps

🏛️ Regulator-grade. Cada respuesta cita endpoint CIMA REST oficialmente documentado + timestamp. Audit trail por petición vía logs JSON estructurados (alineado con EU GMP Annex 11). Sin alucinación, sin datos derivados — solo el registro AEMPS publicado, expuesto tal cual.

🔒 Read-only por construcción. Proxy fino sobre la API pública AEMPS. Cero escrituras. Cero PII procesada. Cero clinical decision support — esto NO es un dispositivo médico (MDR 2017/745 no aplica). Detalles del threat model en SECURITY.md.

🌐 Estándar abierto. Apache-2.0. Listado en registry.modelcontextprotocol.io. Implementación de referencia para servidores MCP en sectores regulados — quien quiera mirror oficial de su propio NCA (EMA, AIFA, Swissmedic, …) tiene aquí el blueprint.


Catálogo

21 herramientas MCP — todas mapean 1:1 a endpoints CIMA REST oficiales
HerramientaEndpoint CIMADescripción
obtener_medicamentoGET /medicamentoFicha completa por CN o nregistro
buscar_medicamentosGET /medicamentosBúsqueda paginada con 20+ filtros
buscar_en_ficha_tecnicaPOST /buscarEnFichaTecnicaFull-text dentro de fichas técnicas
listar_presentacionesGET /presentacionesListado con filtros
obtener_presentacionGET /presentacion/:cnDetalle por Código Nacional
buscar_vmppGET /vmppEquivalentes clínicos (VMP/VMPP)
consultar_maestrasGET /maestrasATC, principios activos, formas, laboratorios
registro_cambiosGET|POST /registroCambiosHistórico de altas / bajas / modificaciones
problemas_suministroGET /psuministro + GET /psuministro/v2/cn/:cnListado global o por Código Nacional
problemas_suministro_dcpGET /psuministro/v2/dcp/:dcpPor DCP (descripción clínica)
problemas_suministro_dcpfGET /psuministro/v2/dcpf/:dcpfPor DCPF (con forma farmacéutica)
listar_notas / obtener_notasGET /notas/:nregistroNotas de seguridad
listar_materiales / obtener_materialesGET /materiales/:nregistroMateriales informativos
doc_seccionesGET /docSegmentado/secciones/:tipoMetadatos de secciones
doc_contenidoGET /docSegmentado/contenido/:tipoContenido (JSON / HTML / texto)
html_ficha_tecnicaGET /dochtml/ft/:nregistro/:fileHTML completo de la FT
html_prospectoGET /dochtml/p/:nregistro/:fileHTML completo del prospecto

Todas las tools llevan anotaciones MCPreadOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true — para que clientes spec-compliant no pidan confirmación por consulta.

11 recursos curados bajo el esquema URI cima:// — cacheables, sin coste de tokens

Recursos estáticos:

URIContenido
cima://maestras/atcÁrbol completo de códigos ATC
cima://maestras/principios-activosListado completo
cima://maestras/laboratoriosLaboratorios titulares de autorización
cima://maestras/formas-farmaceuticasComprimido, inyectable, …
cima://maestras/vias-administracionOral, IV, tópica, …

Templates:

URI templateContenido
cima://maestras/atc/{codigo}Lookup ATC (p.ej. C09AA02 → Enalapril)
cima://maestras/principios-activos/{id}Lookup principio activo
cima://docs/ficha-tecnica/{nregistro}HTML completo
cima://docs/ficha-tecnica/{nregistro}/{seccion}Sección concreta (4.1, 4.8, 5.1, …)
cima://docs/prospecto/{nregistro}HTML completo
cima://docs/prospecto/{nregistro}/{seccion}Sección concreta (1, 2, 3, 4, 5, 6)
10 prompts MCP curados — workflows profesionales y de paciente listos para invocar
PromptAudienciaCaso de uso
identificar_cnFarmacia comunitariaTarjeta resumen one-screen a partir de un Código Nacional
equivalencias_genericasFarmacia comunitariaSustitución durante desabastecimiento
vigilancia_pacienteFarmacia hospitalariaNotas de seguridad activas para una cartera de medicación
comparar_fichas_tecnicasHospital + industriaTabla wide-format comparando 2-5 medicamentos sección a sección
auditar_cartera_laboratorioIndustriaSnapshot regulatorio completo de un laboratorio
monitorizar_cambios_carteraRegulatory affairsDiff de altas / bajas / modificaciones sobre una lista de productos
informe_posicionamiento_terapeuticoHospital + industriaIPE/IPT + indicación autorizada + mecanismo
material_visual_pacienteCounselingFotos, vídeos, material informativo segregado por audiencia
info_medicamento_para_no_sanitariosPúblico generalResumen llano sin jerga
comprobar_interaccion_principios_activosHospital + industriaBúsqueda textual sobre la sección 4.5 (Interacciones)

Los prompts dirigidos a pacientes cierran siempre con un disclaimer "no es consejo médico" — cubierto por test (tests/test_prompts.py); su eliminación rompe CI.


Configuración

Cero variables requeridas — el servidor arranca con defaults sensatos. Las opciones más usadas:

VariableDefaultPara qué
UVICORN_HOST127.0.0.1Loopback por defecto desde v0.4.16. mcp-aemps up --bind-all o UVICORN_HOST=0.0.0.0 para Docker / reverse-proxy.
PORT8765Puerto HTTP. Auto-fallback si está ocupado.
REDIS_URLActiva cache distribuida + rate-limit compartido entre réplicas. Opcional.
MCP_AEMPS_LOCALEautoes / en. Auto-detecta del SO.
MCP_AEMPS_DNS_REBINDING_PROTECTIONtrueValidación Host / Origin en /mcp. Activado por defecto desde v0.4.16. Reverse-proxy: extiende MCP_AEMPS_ALLOWED_HOSTS.
METRICS_KEYRequerido para habilitar /internal/metrics (fail-closed desde v0.4.16).
OAUTH_ENABLEDfalseActiva modo OAuth 2.1 Resource-Server (multi-tenant SaaS).
LOG_LEVELINFONivel logging

OAuth 2.1: cinco env vars (OAUTH_ISSUER, OAUTH_JWKS_URL, OAUTH_AUDIENCE, OAUTH_REQUIRED_SCOPES). RFC 9728 Protected Resource Metadata expuesto en /.well-known/oauth-protected-resource. Sin Authorization Server embebido — bring your own (Auth0 / Keycloak / Hydra / Stytch / Cloudflare). Detalles en SECURITY.md.


Despliegue

stdio (default). Cada cliente MCP arranca uvx mcp-aemps@latest stdio bajo demanda. Sin servidor que mantener. Sin gestión de puertos. Es el patrón Anthropic-canonical — usa esto si solo quieres que tu agente local consulte CIMA.

HTTP compartido (multi-usuario). mcp-aemps up --bind-all + reverse-proxy (nginx / Caddy / Traefik) + MCP_AEMPS_DNS_REBINDING_PROTECTION=true + MCP_AEMPS_ALLOWED_HOSTS=tu-dominio.com. Con OAuth 2.1 activado para gating. Una sola instancia sirve a equipos enteros.

Docker / Compose.

docker run -p 8765:8765 ghcr.io/romanpert/mcp-aemps:latest
docker compose up -d   # con Redis opcional para cache distribuida

MCP Registry. Listado como io.github.romanpert/mcp-aemps. Los clientes MCP-aware lo descubren automáticamente.

Observabilidad. /health/live, /health/ready (Kubernetes-friendly), /internal/metrics (gated por METRICS_KEY). Logs JSON estructurados con correlation IDs. Para Prometheus / OpenTelemetry, plug-in vía extra_middleware / startup_hooks del factory — ver app/factory.py.


Hooks de auditoría (Claude Code)

El sistema de hooks de Claude Code ejecuta comandos shell client-side alrededor de cada llamada a tool. El matcher mcp__mcp-aemps__* captura cada herramienta de este servidor — útil para audit trails GMP Annex 11 / EMA GVP.

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "mcp__mcp-aemps__.*",
        "hooks": [
          {
            "type": "command",
            "command": "jq -c '{ts: now, session: .session_id, tool: .tool_name, args: .tool_input}' >> ~/.claude/audit/mcp-aemps.jsonl"
          }
        ]
      }
    ]
  }
}

Equivalente server-side disponible vía pre_tool_hooks / post_tool_hooks en create_app(...) — útil cuando no puedes confiar en que cada usuario tenga el ~/.claude/settings.json correcto. Detalles en app/tool_hooks.py.


Compliance y seguridad

mcp-aemps está construido para entornos regulados — sin sustituir el juicio profesional:

  • Datos públicos AEMPS — sin PII, sin patient data, sin clinical decision support.
  • Audit trail — logs JSON estructurados con correlation IDs, retención configurable (LOG_RETENTION_DAYS).
  • Sin GPL en el paquete — Apache-2.0 limpio, distribuible en stack farmacéutico privado.
  • Threat model auditado — STRIDE pass end-to-end por release. Política completa en SECURITY.md.
  • Disclosure coordinadaroman.p98@gmail.com, triage en 48h.

Posture detallada (GDPR Art.5, LOPD-GDD, EU GMP Annex 11, EMA GVP Module VI): CLAUDE.md.


Roadmap & versioning

mcp-aemps mirrorea el surface CIMA REST 1:1 — ni más, ni menos. Las mejoras hasta v1.0 son calidad (eficiencia, seguridad, escalabilidad, modularidad), no nuevas features.

Add-ons que NO encajan en esta scope rule (extracción de PDF de IPT, descarga de imágenes de medicamentos, agregación multi-NCA, push notifications) viven en un repo separado, premium-tier, que importa este mcp-aemps>=0.4.x desde PyPI como dependencia.

CHANGELOG completo: CHANGELOG.md. Política de versionado en CLAUDE.md.


Contribuir

Issues y PRs en inglés. Conventional commits. Setup, estándares de código, y las hard scope rules en CONTRIBUTING.md.

Si construyes algo serio sobre mcp-aemps en producción farmacéutica / hospitalaria, escríbeme — me interesa el use case, y los road-map items se priorizan en parte por demanda concreta.


Licencia & autor

Apache-2.0 · Author: Román Pérez Dumpert · roman.p98@gmail.com

GitHub stars


MCP Registry identifier: mcp-name: io.github.romanpert/mcp-aemps