MCP connector to evaluate a synthetic health data space
Proyecto H-Mantis / OEG-UPM
Versión: Abril 2026
Hemos creado un servidor público que permite a cualquier asistente de inteligencia artificial (IA) consultar datos de salud sintéticos. Los datos están organizados según el estándar europeo EHDS (Espacio Europeo de Datos de Salud).
El servidor está disponible en:
https://mcp.linkeddata.es/sse
Puedes hacer preguntas como:
- "¿Qué conjuntos de datos de salud están disponibles?"
- "¿Cuál es el medicamento más común en el grupo de diabetes?"
- "¿Puedo usar estos datos para entrenar un modelo comercial de IA?"
Requisitos: Cuenta en claude.ai (gratuita o de pago)
Pasos:
-
Abre claude.ai en tu navegador.
-
Haz clic en tu foto de perfil (arriba a la derecha) → Settings (Configuración).
-
En el menú de la izquierda, haz clic en Connectors (Conectores).
-
Haz clic en Add custom connector (Añadir conector personalizado).
-
En el campo de URL, escribe:
https://caad-138-100-11-141.ngrok-free.app/sse -
Dale un nombre, por ejemplo: EHDS Health Data Space
-
Haz clic en Save (Guardar).
-
Abre una nueva conversación y pregunta:
¿Qué conjuntos de datos de salud hay disponibles?
Claude buscará automáticamente en los datos reales y te dará una respuesta precisa.
Requisitos: Clave API de Anthropic (ANTHROPIC_API_KEY)
Instalación:
pip install anthropic mcpCódigo de ejemplo:
import anthropic
import asyncio
from mcp.client.sse import sse_client
from mcp import ClientSession
MCP_URL = "https://caad-138-100-11-141.ngrok-free.app/sse"
async def consultar_ehds(pregunta: str):
async with sse_client(MCP_URL) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
# Obtener herramientas disponibles
tools = await session.list_tools()
# Convertir al formato de Anthropic
anthropic_tools = []
for tool in tools.tools:
anthropic_tools.append({
"name": tool.name,
"description": tool.description,
"input_schema": tool.inputSchema,
})
client = anthropic.Anthropic()
messages = [{"role": "user", "content": pregunta}]
# Bucle agéntico
while True:
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
tools=anthropic_tools,
messages=messages,
)
if response.stop_reason == "end_turn":
for block in response.content:
if hasattr(block, "text"):
print(block.text)
break
# Ejecutar llamadas a herramientas
messages.append({"role": "assistant", "content": response.content})
tool_results = []
for block in response.content:
if block.type == "tool_use":
result = await session.call_tool(block.name, block.input)
result_text = result.content[0].text if result.content else "{}"
tool_results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": result_text,
})
messages.append({"role": "user", "content": tool_results})
# Ejecutar
asyncio.run(consultar_ehds("¿Qué conjuntos de datos hay disponibles?"))Requisitos:
Instalación de mcphost:
go install github.com/mark3labs/mcphost@latest
export PATH=$PATH:~/go/binDescargar un modelo:
ollama pull llama3.2Crear el archivo de configuración (~/.mcp.json):
{
"mcpServers": {
"ehds": {
"url": "https://caad-138-100-11-141.ngrok-free.app/sse"
}
}
}Ejecutar:
mcphost -m ollama:llama3.2Se abrirá una sesión interactiva. Escribe tu pregunta y el modelo consultará automáticamente los datos del servidor.
Ejemplo de sesión:
> ¿Qué conjuntos de datos de salud están disponibles?
[Herramienta] ehds_list_datasets → 3 conjuntos encontrados
Hay 3 conjuntos de datos disponibles:
1. Cohorte sintética de Diabetes Tipo 2 — 48 pacientes
2. Cohorte sintética de Hipertensión Esencial — 50 pacientes
3. Cohorte sintética de Síndrome Metabólico — 22 pacientes
Requisitos: Clave API de OpenAI (OPENAI_API_KEY)
Instalación:
pip install openai mcpCódigo de ejemplo:
import openai
import asyncio
import json
from mcp.client.sse import sse_client
from mcp import ClientSession
MCP_URL = "https://caad-138-100-11-141.ngrok-free.app/sse"
async def consultar_ehds_gpt(pregunta: str):
async with sse_client(MCP_URL) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
# Obtener herramientas disponibles
tools_response = await session.list_tools()
# Convertir al formato de OpenAI
openai_tools = []
for tool in tools_response.tools:
openai_tools.append({
"type": "function",
"function": {
"name": tool.name,
"description": tool.description,
"parameters": tool.inputSchema,
}
})
client = openai.OpenAI()
messages = [{"role": "user", "content": pregunta}]
# Bucle agéntico
while True:
response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
tools=openai_tools,
tool_choice="auto",
)
msg = response.choices[0].message
messages.append(msg)
if not msg.tool_calls:
print(msg.content)
break
# Ejecutar llamadas a herramientas
for tool_call in msg.tool_calls:
args = json.loads(tool_call.function.arguments)
result = await session.call_tool(tool_call.function.name, args)
result_text = result.content[0].text if result.content else "{}"
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": result_text,
})
# Ejecutar
asyncio.run(consultar_ehds_gpt("¿Qué conjuntos de datos hay disponibles?"))Estas preguntas funcionan bien con todas las opciones:
| Pregunta | Herramienta que se usa |
|---|---|
| "¿Qué conjuntos de datos de salud hay disponibles?" | ehds_list_datasets |
| "¿Cuál es el medicamento más común en el grupo de diabetes?" | ehds_query_clinical |
| "¿Cuántos pacientes femeninos hay en el grupo de hipertensión?" | ehds_get_condition_stats |
| "¿Puedo usar los datos de diabetes para entrenar un modelo comercial?" | ehds_check_policy |
| "¿Qué dataset tiene más pacientes?" | ehds_list_datasets |
| "Compara la distribución de género entre los tres grupos" | ehds_get_condition_stats (×3) |
| Herramienta | Descripción |
|---|---|
ehds_list_datasets |
Lista todos los conjuntos de datos del catálogo |
ehds_describe_dataset |
Metadatos completos de un conjunto de datos |
ehds_check_policy |
Política de uso ODRL (permisos y prohibiciones) |
ehds_search_datasets |
Buscar conjuntos de datos por palabra clave |
ehds_get_patients |
Lista de pacientes con datos demográficos |
ehds_get_condition_stats |
Estadísticas por código SNOMED CT |
ehds_query_clinical |
Consulta SPARQL libre sobre datos clínicos |
- Datos: 120 pacientes sintéticos, 3,37 millones de triples RDF
- Formato clínico: FHIR R4 sobre RDF (HL7)
- Catálogo: HealthDCAT-AP Release 5 (estándar europeo EHDS)
- Políticas: ODRL 2.2 (uso solo para investigación, sin re-identificación)
- Motor de consultas: Apache Jena Fuseki 6 (SPARQL 1.1)
- Protocolo IA: MCP (Model Context Protocol), Anthropic, noviembre 2024
- Licencia datos: Creative Commons CC-BY 4.0
Proyecto HARNESS — Horizon Europe grant 101169409
Ontology Engineering Group, Universidad Politécnica de Madrid