Skip to main content
Glama

NeuroGraph

Instrumento científico computacional de neuroinformática: permite consultar, analizar y visualizar redes cerebrales (regiones, tractos, conectividad, literatura, homologías entre especies) a partir de una biblioteca de datos portátil. La IA (Claude u otro modelo) es su intérprete, nunca su motor científico — ver docs/analisis-arquitectura.md para el razonamiento completo y las decisiones tomadas.

Estado del proyecto

Fase 0 — Entorno (hecho). Repositorio, estructura de módulos, base de datos, ontología inicial, sistema de biblioteca SSD y API mínima están esqueletizados y probados.

Fase 1 — Arquitectura (hecho). El frontend (Vite + React + TypeScript + Three.js + D3) renderiza el connectograma y el cerebro 3D, con filtros (red / tipo de conectividad / peso), panel de detalle y codificación visual de nivel de evidencia y dirección (secciones 5.1, 5.3, 24), todo sincronizado entre las dos vistas. El esquema de PostgreSQL está aplicado en la base de datos real y comprobado funcionalmente — ver backend/database/migrations/. Falta: decidir el empaquetado de escritorio (Tauri) cuando haya Rust disponible.

Fase 2 — Biblioteca de datos (en curso). Manifiesto de biblioteca (.neurograph_library.yaml), manifiesto de dataset (dataset.yaml) y escaneo automático de una biblioteca (scan_library_datasets) hechos y probados. Biblioteca real creada en E:\NeuroData (separada del código, tal y como describe docs/portabilidad.md), con tabla libraries en la base de datos (migración 0002) y su alta generada en backend/database/seed/register_library_neurodata.sql. Falta: registrar datasets concretos en la base de datos según se vayan incorporando datos reales.

Fase 3 — Neuroimagen (en curso). Primer atlas real cargado: HCP-MMP1.0 (Glasser et al., 2016) — especie, atlas, 360 regiones corticales y sus 360 coordenadas reales (espacio de referencia explícito: fsLR_32k_S1200_groupavg_midthickness_MSMAll, nunca asumido como MNI/Talairach). El frontend ya las consume de verdad: si docker compose up -d está corriendo, GET /regions las sirve y la vista de desarrollo muestra el aviso verde "DATOS REALES" en vez del amarillo "DATOS SINTÉTICOS" — nunca mezclados en la misma vista. Las 360 regiones ya están clasificadas en las 12 redes funcionales de Cole-Anticevic (voto mayoritario de vértices, confidence y method registrados por región — nunca inventado); el connectograma y el cerebro 3D las colorean por red real en vez de mostrarlas todas del mismo gris. Segundo atlas cortical cargado: Gordon 333 (Gordon et al., 2016, DOI 10.1093/cercor/bhu239) — 333 regiones y sus propias 12 redes (no las de Cole-Anticevic: son dos clasificaciones distintas, aunque coincidan en algún nombre — ver el riesgo anotado en docs/analisis-arquitectura.md). El mismo archivo declaraba 19 estructuras subcorticales sin ningún dato real detrás (comprobado, no asumido); en su lugar se dio de alta la segmentación subcortical real que sí trae el espacio de grayordinates del HCP (19 estructuras: amígdala, hipocampo, tálamo... más cerebelo y tronco del encéfalo) como su propio atlas, citando a quien de verdad la define (Glasser et al., 2013, DOI 10.1016/j.neuroimage.2013.04.127), no a Gordon et al. El color de cada red en la interfaz ya se resuelve por <fuente>.<red> (no solo por el nombre corto): dos redes de atlas distintos con el mismo nombre ("Default", "Visual"...) nunca comparten color sin aviso.

Fase 4 — Conectividad (en curso). Segundo atlas real: Brainnetome (246 regiones, coordenadas volumétricas reales en MNI152). Conectividad estructural real derivada de sus mapas de probabilidad de tractografía (30 135 conexiones, media simetrizada sin umbral — decisión tomada con la usuaria; cada una con evidence_level=indirect explícito, nunca asumido). Nuevo GET /connections y un selector de atlas en el frontend (HCP-MMP1.0 con redes, o Brainnetome con conectividad — nunca los dos a la vez).

Cierre de cabos sueltos de las Fases 3/4: cada atlas ya cargado enlaza ahora de forma estructurada con la publicación que lo define (atlases.study_id), en vez de solo llevar la cita como texto suelto en su nombre — DOI verificados directamente en la web del editor, no adivinados.

Fase 5 — Matemática (en curso). backend/core/graph/ calcula, con NetworkX/NumPy/SciPy: matriz de adyacencia, matriz de grados, Laplaciano (explícito), autovalores/autovectores, embedding espectral, detección de comunidades, modularidad, centralidad (grado/intermediación/autovector), coeficiente de participación, rich-club y caminos mínimos. Desde el 28/08/2026 ya está conectado a datos reales: GET /graph-metrics?atlas_id=... construye el grafo con las regiones y conexiones reales de un atlas (un par con peso exactamente 0 se excluye, nunca cuenta como conexión débil) y devuelve sus métricas. Probado con la conectividad real de Brainnetome (246 nodos, 15 803 aristas, ~3 s): encuentra 3 comunidades y sitúa el tálamo como la estructura más central, coherente con la literatura. De paso se encontró y corrigió un error real en la centralidad de intermediación, que invertía conexiones fuertes y débiles (nunca detectado antes porque las pruebas solo usaban pesos uniformes). Total: 21 pruebas del motor matemático, todas en verde. Gordon 333 no tiene ninguna conexión cargada todavía, así que ahí el endpoint responde pero no aporta nada útil hasta que haya conectividad real que analizar.

Conectividad tracto-región sobre HCP-MMP1.0 (29/08/2026). Yeh FC (2022, Nature Communications, DOI 10.1038/s41467-022-32595-4): probabilidad poblacional (1065 sujetos) de que cada uno de 26 tractos de sustancia blanca nombrados atraviese cada una de las 180 áreas de HCP-MMP1.0, por hemisferio. No es una conexión región-región — se decidió con la usuaria no inferirla — así que el tracto es su propia entidad Tract en el grafo (52 = 26 x 2 hemisferios), con conexiones tracto -> región (9360, sin umbral, incluido el 75,3% en probabilidad exactamente 0.0).

Cerebelo — distribución de redes, sin voto mayoritario único (29/08/2026). El tálamo ya estaba cubierto (Brainnetome + tractos corticotalámicos de Yeh); el cerebelo no tenía ninguna conexión. Sin descargar nada nuevo: el archivo de Cole-Anticevic ya usado para las redes de HCP-MMP1.0 trae también redes reales para el cerebelo (100% de sus 17 853 grayordinates). Forzar un único ganador (como se hace para HCP-MMP1.0) sería engañoso aquí — la red mayoritaria del cerebelo apenas llega al 30% — así que se registra la distribución completa (10 de 12 redes por hemisferio, confianzas que suman 1.0).

Related MCP server: ViromeChat MCP server

Estructura

backend/
├── core/            módulos científicos (neuroimagen, conectoma, grafos,
│                    espectral, evolución, neuropsicología)
├── library/         detección, integridad e indexación de la biblioteca SSD
├── ingestion/       importación de literatura, neuroimagen y datasets
├── ontology/        tipos de entidad y esquema de identificadores
├── database/        modelos SQLAlchemy, migraciones, repositorios
├── api/             API científica (FastAPI) — interfaz real e independiente de IA
├── mcp/             adaptador MCP sobre la API, para modelos de IA
├── ai/              proveedores de IA intercambiables (Claude, OpenAI, local...)
├── visualization/   produce descriptores de escena, no renderiza
├── tests/
└── config/          configuración (YAML + variables de entorno)

frontend/            (pendiente — Tauri + React + Three.js + D3, ver decisión de arquitectura)
docs/
scripts/

Poner en marcha el entorno de desarrollo

1. Base de datos y API (necesita Docker Desktop instalado):

cp .env.example .env             # y edita la contraseña
docker compose up -d

Esto levanta dos contenedores: Postgres (puerto 5432) y la API de NeuroGraph (puerto 8420, backend/Dockerfile) — no hace falta tener Python instalado para esto. Comprobar que responde: curl http://127.0.0.1:8420/health.

La base de datos arranca vacía. Si tienes un volcado (scripts/export_snapshot.ps1), cárgalo; si no, reconstrúyela desde los .sql del repositorio con scripts/rebuild_db_from_sql.sh (orden de carga y lo que no incluye: backend/database/migrations/README.md).

2. Frontend (necesita Node.js instalado):

cd frontend
npm install
npm run dev

Abre la URL que imprima (normalmente http://localhost:5173). Si la API del paso 1 está corriendo y tiene datos, verás el aviso verde "DATOS REALES"; si no, cae automáticamente a datos sintéticos con aviso amarillo — nunca los mezcla.

3. Backend en desarrollo (solo si vas a tocar código Python; para solo usar la aplicación, el paso 1 ya es suficiente):

python -m venv .venv             # desde la raíz del repositorio, NUNCA
                                  # desde dentro de backend/ -- pyproject.toml
                                  # vive en la raíz, no en backend/
source .venv/bin/activate        # En Windows: .venv\Scripts\activate
pip install -e ".[dev]"
pytest

4. Conectar un cliente MCP real (p. ej. Claude Desktop) al servidor de backend/mcp/server.py -- necesita el paso 1 (Postgres arrancado) y el paso 3 (entorno virtual con pip install -e ".[dev]" ya hecho):

Edita %APPDATA%\Claude\claude_desktop_config.json (Windows; en macOS es ~/Library/Application Support/Claude/claude_desktop_config.json) y añade una entrada bajo mcpServers, usando el python.exe del propio entorno virtual (nunca python a secas: así no depende de qué PATH tenga el proceso que lo arranca) y la contraseña real de tu Postgres (la misma que pusiste en .env) por variable de entorno explícita, para no depender de si .env se carga o no:

{
  "mcpServers": {
    "neurograph": {
      "command": "E:\\Neurograph\\.venv\\Scripts\\python.exe",
      "args": ["-m", "backend.mcp.server"],
      "env": {
        "NEUROGRAPH_DATABASE__PASSWORD": "tu-contraseña-real-de-postgres"
      }
    }
  }
}

Guarda, cierra Claude Desktop del todo y vuelve a abrirlo. Si el servidor no aparece, revisa %APPDATA%\Claude\logs\mcp-server-neurograph.log.

Principios que gobiernan el diseño

  • Los datos originales nunca se modifican; toda transformación genera un artefacto derivado con procedencia registrada (sección 3).

  • Conectividad estructural, funcional y efectiva nunca se mezclan (sección 8).

  • Dato observado, inferencia comparativa e hipótesis de homología se distinguen siempre explícitamente (sección 11, sección 24).

  • La IA nunca inventa conexiones, homologías ni evidencia (sección 1).

Ver docs/principios.md para la lista completa de principios vigentes y docs/analisis-arquitectura.md para el razonamiento de cada decisión.

Licencia

NeuroGraph (código, documentación, esquema de base de datos y activos visuales) es de Juan Boza ("Proxy") — Instituto Dédalus, y se distribuye bajo Creative Commons Reconocimiento-CompartirIgual 4.0 Internacional (CC BY-SA 4.0) — ver el archivo LICENSE para el texto completo y el resumen en lenguaje llano.

Esto NO cubre los datos científicos de terceros que NeuroGraph consulta o carga (atlas, tractografía, estudios publicados) — cada uno conserva la licencia/términos de su propia fuente original, citada en docs/analisis-arquitectura.md junto a cada dataset.

Available Tools

12 tools
calculate_laplacianA

Espectro del Laplaciano del grafo real de un atlas (autovalores, ascendente): el segundo autovalor, en un grafo conexo, es su "conectividad algebraica" -- cuánto le cuesta desconectarse. connection_type nunca mezcla structural/functional/effective (sección 8); min_weight es un umbral explícito que decide quien llama, no uno aplicado de antemano al cargar los datos.

Inputs: atlas_id (required), min_weight, connection_type. Returns: Vista de `GraphMetrics` para la herramienta MCP `calculate_laplacian` (Fase 10,…

calculate_spectrumB

Embedding espectral 2D del grafo real de un atlas (Laplacian eigenmaps): una posición por región derivada de la estructura del grafo, útil para ver agrupamientos sin depender de la posición anatómica. None por región cuando el grafo tiene menos de 4 nodos (nunca un embedding inventado para un grafo demasiado pequeño).

Inputs: atlas_id (required), min_weight, connection_type. Returns: Vista de `GraphMetrics` para la herramienta MCP `calculate_spectrum` (Fase 10,…

compare_speciesA

Compara dos especies reales combinando un resumen cuantitativo y la lista completa de homologías compartidas (decisión de la usuaria, 31/08/2026: "ambos combinados"). El resumen cuenta cuántas regiones reales tiene cargada cada especie y cuántas de ellas participan en alguna homología real con la otra especie de esta comparación -- nunca compara "topología" entre especies, porque solo el humano tiene conectividad estructural real cargada (Brainnetome/HCP-MMP1.0); chimpancé y macaco solo tienen regiones y homologías. Lanza un error si alguna de las dos especies no existe -- nunca compara contra una especie inventada.

Inputs: species_a_id (required), species_b_id (required). Returns: species_a, species_b, homologies, homology_count, +1 more

compare_species_imagesA

Tres imágenes PNG reales que comparan dos especies (decisión de la usuaria, 31/08/2026): (1) un connectograma circular con las regiones reales de las dos especies (todos sus atlas), coloreadas en tres categorías -- exclusiva de la especie A, exclusiva de la especie B, y homóloga/compartida (participa en al menos una homología real con la otra especie de esta comparación) -- con una cuerda real por cada homología y leyenda de las tres categorías; (2) y (3), un esquema interhemisférico real por especie (solo sus regiones homólogas con la otra), coloreado por hemisferio real. Nunca superpone las dos especies en un único cerebro 3D: cada una tiene su propia anatomía y su propio espacio de referencia (decisión 29), así que no tendría sentido dibujarlas juntas en una escena espacial. Lanza un error si alguna de las dos especies no existe, o si existen pero no comparten ninguna homología real.

structured_output=False (bug real encontrado al conectar esta herramienta, 31/08/2026, decisión 37): el SDK de MCP intenta generar un esquema pydantic de salida a partir del tipo de retorno anotado, y Image está especialcasada para un retorno suelto pero NO dentro de un list[...] -- sin este parámetro, registrar la herramienta lanzaba PydanticSchemaGenerationError en cuanto se importaba este módulo, antes incluso de poder llamarla.

Inputs: species_a_id (required), species_b_id (required), min_weight, connection_type.

find_homologuesA

Busca homologías reales entre especies ya cargadas (54 en este proyecto, todas de Cheng et al. 2021, con status="candidate_homology" y confidence=None porque el propio estudio no da ningún número utilizable con solo 3 especies -- nunca se inventa una confianza). region_id filtra a las que tocan esa región concreta (en cualquiera de los dos extremos); species_id, a las que tocan esa especie. Cada homología lleva la región y la especie real de sus dos extremos, y su cita real si el dataset de origen tiene un estudio enlazado (nunca una cita inventada).

Inputs: region_id, species_id. Returns: result

find_pathA

Camino más corto real entre dos regiones del mismo atlas, sobre el grafo de conectividad de connection_type (un peso mayor es una conexión más fuerte, no un coste mayor -- el camino real más corto tiende hacia las conexiones fuertes). path y distance quedan en None cuando source_id/target_id no pertenecen a este atlas, o cuando no existe ningún camino real entre ambos (p. ej. componentes desconectadas) -- nunca se aproxima ni se inventa un camino.

Inputs: atlas_id (required), source_id (required), target_id (required), min_weight, +1 more. Returns: path, atlas_id, distance, source_id, +3 more

get_connectivityA

Conectividad real entre un conjunto de regiones dadas: qué conexiones existen entre ellas y qué tractos con nombre las tocan (con su cita real). Con menos de dos region_ids no hay conectividad "entre regiones" que calcular, y se devuelve vacío en vez de reinterpretar la petición.

Inputs: region_ids (required). Returns: tracts, region_ids, connections

propose_dataset_ingestionA

Propone el SQL de alta de un dataset real ya organizado con su dataset.yaml y su mapa files (decisión 46, cierra el ciclo que la decisión 44 dejó preparado: manifiesto real -> lector real -> SQL). dataset_dir es una ruta LOCAL en la máquina donde corre este servidor MCP (la misma que ya aloja la biblioteca de datos, sección 23) -- nunca una ruta remota ni relativa a este proceso.

Solo funciona si el format del manifiesto ya es una de las cuatro etiquetas de backend/ingestion/datasets/formats.py::SUPPORTED_FORMATS (nunca unsupported_pending_adapter, que necesita su propio adaptador nuevo primero, ver docs/protocolo-ingesta-ia.md) y si su mapa files cubre todos los roles que ese formato necesita.

NUNCA toca la base de datos real ni la conexión con ella: solo genera y devuelve el SQL de alta (idempotente, ON CONFLICT DO UPDATE, mismo estilo que todos los scripts/register_*.py) para que una persona lo revise antes de aplicarlo -- ninguna automatización de este protocolo sustituye esa revisión humana (decisión 17). study_id/study_name son opcionales pero, si se da uno, hace falta el otro: sin ellos, el atlas se da de alta sin enlazar ningún estudio (nunca uno inventado).

Inputs: dataset_dir (required), study_id, study_doi, study_name, +3 more. Returns: SQL de alta propuesto para un dataset real, sin aplicar todavía. `sql` puede se…

render_brainB

Imagen PNG real: proyección 2D (vista axial, coordenada real X/Y de cada región, eje Z descartado) de un atlas, coloreada por red funcional real (leyenda incluida), con las conexiones reales por encima de min_weight como líneas finas. Lanza un error si el atlas no tiene ninguna región real cargada.

Inputs: atlas_id (required), min_weight, connection_type.

render_networkB

Imagen PNG real: connectograma circular de un atlas, con los nodos coloreados por red funcional real (leyenda incluida) y una cuerda gris por cada conexión real por encima de min_weight. Nunca un descriptor de escena -- una imagen real, igual que pidió la usuaria (31/08/2026). Lanza un error si el atlas no tiene ninguna región real cargada.

Inputs: atlas_id (required), min_weight, connection_type.

search_regionA

Busca regiones reales cargadas en NeuroGraph. atlas_id filtra a un atlas concreto (p. ej. "atlas.human.hcp.mmp1_0"); sin él, se devuelven las regiones de todos los atlas cargados. Cada región lleva su coordenada real, el espacio de referencia en el que está expresada, y su red funcional si ya se calculó una (si no, "unclassified" -- nunca una red inventada). network_source elige la clasificación de red (decisión 73): p. ej. "cole-anticevic" (la de siempre en HCP-MMP1.0), "yeo2011-7", "yeo2011-17" o "power2011"; sin él, la original de cada atlas.

Inputs: atlas_id, network_source. Returns: result

search_tractA

Busca tractos reales por nombre/abreviatura (subcadena) y/o por una región que deban tocar. Cada tracto devuelto lleva TODAS las regiones reales que toca (no solo region_id, si se dio uno) y su cita real. Un tracto sin ninguna conexión real registrada no aparece: no hay nada verificado que reportar sobre él.

Inputs: name, region_id. Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.9/5.0

    Scored across 12 tools

    Disambiguation4/5

    Most tools have clearly distinct purposes, but a few close pairs exist: render_brain vs render_network both visualize atlas connectivity, and calculate_laplacian vs calculate_spectrum both operate on graph spectra. The descriptions clarify the different output modalities well enough to avoid serious misselection.

    Naming Consistency5/5

    All tool names follow a consistent verb_noun snake_case pattern: search_region, get_connectivity, render_network, find_homologues, propose_dataset_ingestion. There are no mixed conventions or vague generic verbs.

    Tool Count5/5

    Twelve tools is well within the ideal range and each tool covers a distinct aspect of the domain: exploration, connectivity, spectral analysis, visualization, species comparison, and dataset ingestion. The count feels appropriately scoped for a specialized neuroimaging server.

    Completeness4/5

    The toolset covers the core workflows well: searching regions and tracts, computing connectivity and paths, spectral analysis, rendering visualizations, comparing species, and proposing dataset ingestion. Minor gaps exist, such as no direct list_atlases or list_species tool, but these can be worked around via search_region and find_homologues.

    Maintenance

    ActivitySlowing
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      Not graded
      quality
      D
      maintenance
      Enables AI tools to access and contribute to shared semantic memory, supporting search, capture, and curation of knowledge across multiple brains via the MCP protocol.
      -
    • F
      license
      Not graded
      quality
      C
      maintenance
      Enables AI clients to access virome datasets and external bioinformatics APIs through MCP tools, including Wikipedia, PubMed, NCBI Taxonomy, read-only SQL over S3 Parquet, pandas/Plotly analyses, and map visualizations, while keeping the client decoupled from data and business logic.
      -
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables a connected LLM to inspect brain MRI slices as crops and montages with coordinates, compare a region against its mirrored hemisphere, and review the pipeline's candidate hotspots. It lets the model write prioritised "area to review" annotations that appear live in the browser viewer, and move or read the clinician's crosshair position.
      MIT