neurograph
NeuroGraph MCP server for querying, analyzing, and visualizing real brain network data (regions, tracts, connectivity, homologies, graph metrics, images).
Region search —
search_region: look up real loaded regions, filtered byatlas_idand by functional network classification (network_source: cole-anticevic, yeo2011-7/17, power2011); returns coordinates, reference space, network + confidence/algorithm.Connectivity lookup —
get_connectivity: given a set of region ids, return the real connections among them and the named tracts touching them, with citations.Tract search —
search_tract: find tracts by name/abbreviation substring and/or by a region they must touch, including all regions each tract innervates and its citation.Spectral/graph math —
calculate_laplacian(ascending Laplacian eigenvalues, incl. algebraic connectivity) andcalculate_spectrum(2D spectral embedding for clustering); both per atlas, with explicitmin_weightandconnection_type(never mixing structural/functional/effective).Pathfinding —
find_path: real shortest path and distance between two regions of the same atlas (weight = strength, not cost); returnsNonerather than guessing when no path exists or ids are invalid.Cross-species homology —
find_homologues: real homologies (e.g. Cheng et al. 2021,candidate_homology, no invented confidence), filterable by region or species.Species comparison —
compare_species: quantitative summary (region counts, regions in shared homologies) plus the full list of shared homologies; errors if a species doesn't exist instead of inventing one.Visualization (real PNGs) —
render_network(circular connectogram colored by real functional network),render_brain(2D axial projection with real connections), andcompare_species_images(3 PNGs: cross-species connectogram + per-species interhemispheric homolog schematics).Ingestion proposals —
propose_dataset_ingestion: generate review-ready, idempotent SQL to register a real dataset from itsdataset.yaml, optionally linking a study; never touches the live database.Scientific-integrity guarantees throughout — the server never invents connections, homologies, confidence values, or evidence; it distinguishes observed data from inference, keeps structural/functional/effective connectivity separate, and returns empty/None instead of reinterpreting requests.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@neurograph show me the connectivity of the default mode network"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 -dEsto 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 devAbre 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]"
pytest4. 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 toolscalculate_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
Scored across 12 tools
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.
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.
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.
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
Related MCP Connectors
214 tools for AI agents over one MCP endpoint: image, video, audio, 3D, data, storage, mail, GPUs.
Read-only MCP tools for AI agent discovery, structured resources, and NIULAI information.
Persistent memory, knowledge graph, task management and more for AI agents via MCP.
Your org's AI agents, tasks, runs, search, and brain files as MCP tools and resources.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI tools to access and contribute to shared semantic memory, supporting search, capture, and curation of knowledge across multiple brains via the MCP protocol.-
- FlicenseNot gradedqualityCmaintenanceEnables 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.-
- AlicenseNot gradedqualityBmaintenanceExposes a shared graph-based context engine as MCP tools for Claude, Copilot, and other AI agents, enabling knowledge ingestion, recall, search, and LLM-ready context assembly across sessions.1Apache 2.0
- AlicenseNot gradedqualityBmaintenanceEnables 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