API y asistentes de IA
Consultar y cargar los datos del laboratorio desde planillas, scripts y asistentes como Claude o Cursor, con un token.
La API permite usar los datos del laboratorio desde otros programas: una planilla de Excel que se actualiza sola, un script en Python que arma un reporte, un equipo que registra sus muestras al terminar una corrida o un sistema del instituto que necesita saber dónde está una muestra o cuánto queda de un reactivo.
Cada programa se identifica con un token: una clave larga que empieza con trz_.
Un token actúa en tu nombre, solo en este laboratorio y con el permiso que elijas al
crearlo. Lo que hace queda en el historial como hecho por vos, vía API.
Con un token de Lector/a solo se consulta. Con uno de Editor/a también se carga y se modifica: muestras, equipos, mantenimientos, reservas, insumos, lotes, consumos, pedidos y alarmas de temperatura (ver Cargar y modificar datos). Cada cambio queda en el historial del registro con tu nombre y «vía API · <nombre del token>», igual que si lo hubieras hecho desde la web.
Encender la API (administración)
La API viene apagada en cada laboratorio. Para encenderla, la administración va a Acceso por API y toca Encender.
Desde esa misma pantalla la administración ve los tokens de todas las personas y puede revocar cualquiera. Si la apaga, todos los tokens dejan de funcionar hasta que la vuelva a encender (no se borran).
Crear un token
- Andá a Acceso por API. Si no administrás el laboratorio, lo encontrás en el menú junto a Ayuda, cuando la API está encendida.
- Tocá Crear token y completá:
- Nombre: dónde lo vas a usar, por ejemplo «Planilla de stock».
- Qué puede hacer: como mucho, tu propio rol. Para leer datos alcanza con Lector/a; para cargar o modificar, hace falta Editor/a.
- Vence en: 30, 90, 180 días o un año.
- Copiá el token y guardalo donde lo vayas a usar o en un gestor de contraseñas. Vialo no lo guarda y no lo vas a poder ver de nuevo. Si lo perdés, revocalo y creá otro.
Cada persona puede tener hasta 10 tokens vigentes por laboratorio.
Tratá el token como una contraseña: quien lo tenga puede ver los datos del laboratorio en tu nombre. No lo pegues en una planilla compartida ni en un mensaje. Si creés que se filtró, revocalo: deja de funcionar en ese mismo momento.
Qué podés consultar
La dirección de la API es la de Vialo seguida de /api/v1. En los ejemplos aparece como
https://vialo.ejemplo.org/api/v1: reemplazala por la de tu laboratorio.
| Dirección | Qué devuelve |
|---|---|
/lab | El laboratorio, su logo, su plan (subscription, con can_write) y qué puede hacer el token. Sirve para probar que anda. |
/biobank/samples | Muestras, con filtros (ver abajo). Hasta 200 por página. |
/biobank/samples/PL-2026-00042 | Una muestra por su código (o su id), con su ubicación y sus alícuotas. |
/biobank/samples/<id>/history | El historial de cambios de una muestra. |
/biobank/samples/<id>/attachments | Los adjuntos, con un enlace de descarga que vence a los 5 minutos. |
/biobank/locations | Salas, equipos, racks y cajas, con cuántos lugares ocupados tiene cada caja. |
/biobank/boxes/<id> | La grilla de una caja: cada posición, ocupada o libre. |
/biobank/sample-types | Los tipos de muestra. |
/biobank/fields | Los campos de la muestra, incluidos los personalizados del laboratorio. |
/equipment/items | Equipos, con filtros (ver abajo). Hasta 200 por página. |
/equipment/items/EQ-0004 | Un equipo por su código (o su id), con su plan de mantenimiento y sus fallas abiertas. |
/equipment/items/<id>/events | El registro del equipo: mantenimientos, calibraciones, fallas, reparaciones. |
/equipment/items/<id>/history | El historial de cambios de los datos del equipo. |
/equipment/items/<id>/attachments | Manuales y certificados, con un enlace de descarga que vence a los 5 minutos. |
/equipment/due | Lo vencido y lo que está por vencer de todos los equipos (status, until). |
/equipment/failures | Las fallas abiertas de todos los equipos. |
/equipment/bookings | Reservas de un rango de días (from, to, equipment). |
/equipment/usage | Registro de uso de un rango de días (from, to, equipment). |
/equipment/types | Los tipos de equipo. |
/equipment/providers | Los proveedores de servicio técnico, con su contacto. |
/equipment/fields | Los campos del equipo, incluidos los personalizados del laboratorio. |
/reagents/items | Insumos (reactivos, kits, plásticos, descartables), con su stock y filtros (ver abajo). |
/reagents/items/RE-0003 | Un insumo por su código (o su id), con su stock, sus lotes y si tiene un pedido abierto. |
/reagents/items/<id>/movements | Ingresos, consumos, descartes, ajustes y traslados de un insumo. |
/reagents/items/<id>/history | El historial de cambios de los datos del insumo. |
/reagents/items/<id>/attachments | Fichas de seguridad y certificados, con un enlace de descarga que vence a los 5 minutos. |
/reagents/lots | Lotes vencidos o por vencer que siguen en stock (status, until, q). |
/reagents/movements | El libro de movimientos del laboratorio (item, kind, from, to, controlled). |
/reagents/to-order | Lo que llegó al punto de pedido y todavía no se pidió, con la cantidad sugerida. |
/reagents/orders | Pedidos abiertos (o cerrados, con open=false). |
/reagents/places | Lugares de guardado, en árbol (path: «Sala › Heladera › Estante 1»). |
/reagents/categories | Las categorías de insumos. |
/reagents/suppliers | Los proveedores, con su contacto. |
/reagents/fields | Los campos del insumo y del lote, incluidos los personalizados del laboratorio. |
/monitoring/sensors | Los sensores de temperatura, con su estado ahora y la última lectura (equipment). |
/monitoring/sensors/<id> | Un sensor, con la mínima y la máxima de un período y sus alarmas (ver abajo). |
/monitoring/sensors/<id>/readings | Las lecturas de un período, resumidas por tramos para graficar (points). |
/monitoring/sensors/<id>/history | Quién lo conectó, le cambió el rango o lo desconectó. |
/monitoring/alarms | Las alarmas, con la acción correctiva registrada (pending, sensor, from, to). |
La lista completa, con todos los parámetros, está en /api/v1/openapi.json. Es una
descripción estándar (OpenAPI) que muchas herramientas saben leer.
Filtros de muestras
Se agregan a la dirección después de un ? y se combinan con &. Una muestra aparece si
cumple todos los filtros.
| Filtro | Ejemplo | Qué hace |
|---|---|---|
q | q=PAC-0012 | Busca en el código, el donante, las notas y los campos de texto. |
type | type=Plasma,Suero | Tipos de muestra, por nombre o id. |
status | status=available,in_use | Estados: available, in_use, depleted, discarded, transferred. |
location | location=<id del freezer> | Lo que está en esa ubicación, incluido lo que hay adentro. |
donor | donor=PAC-00 | Parte del código de paciente o donante. |
collected_from, collected_to | collected_from=2026-01-01 | Fecha de extracción, desde y hasta (AAAA-MM-DD). |
created_from, created_to | created_to=2026-06-30 | Fecha de carga, desde y hasta. |
sort | sort=-collection_date | Orden. Con - adelante, de mayor a menor. |
page, limit | page=2&limit=200 | Página y resultados por página. |
Filtros de equipos
| Filtro | Ejemplo | Qué hace |
|---|---|---|
q | q=Eppendorf | Busca en el código, el nombre, la marca, el modelo y los números de serie e inventario. |
type | type=Centrífuga | Tipos de equipo, por nombre o id. |
status | status=out_of_service | Estados: in_service, out_of_service, retired. |
room | room=Sala 2 | Salas. |
attention | attention=overdue | due (vencido o por vencer), overdue (vencido) u open_failure (con una falla abierta). |
sort | sort=next_due | Orden. Con - adelante, de mayor a menor. |
page, limit | page=2&limit=200 | Página y resultados por página. |
Filtros de insumos
| Filtro | Ejemplo | Qué hace |
|---|---|---|
q | q=etanol | Busca en el código, el nombre, la marca, los números de catálogo y CAS, y el código o n.º de un lote. |
category | category=Plásticos | Categorías, por nombre o id. |
place | place=Heladera 2 | Lugares, por nombre, camino o id, incluido lo que tienen adentro. |
supplier | supplier=Biodynamics | Proveedor habitual, por nombre o id. |
storage | storage=fridge | Conservación: room_temp, fridge, freezer_20, freezer_80, ln2, other. |
attention | attention=reorder | any, reorder (en el punto de pedido), due (lotes vencidos o por vencer), expired u out (sin stock). |
controlled | controlled=yes | yes: solo las sustancias controladas; no: sin ellas. |
archived | archived=include | include suma los archivados; only, solo ellos. |
sort | sort=next_expiry | Orden. Con - adelante, de mayor a menor. |
page, limit | page=2&limit=200 | Página y resultados por página. |
El stock de un insumo no cuenta los lotes vencidos y está en la unidad del insumo
(unit).
Sensores y alarmas
Un sensor se indica por su id o, si su equipo tiene uno solo, por el código del equipo
(/monitoring/sensors/EQ-0003). El período de /monitoring/sensors/<id> y de readings se
elige con period (24h, 7d o 30d, hasta ahora; por defecto 24h) o con from y to
(días AAAA-MM-DD en la hora del laboratorio, hasta un año). Las lecturas vienen resumidas: el
período se divide en tramos y de cada uno llegan la más baja y la más alta, así un pico corto
no se pierde. Las temperaturas están en °C.
El state de cada sensor es ok (en rango), out (fuera de rango, todavía dentro de la
demora), alarm (fuera de rango más tiempo que la demora), offline (dejó de mandar
lecturas o está desconectado) o waiting (nunca mandó). /monitoring/alarms devuelve solo
lo que llegó a alarma; con pending=true, las que todavía no tienen anotado qué se hizo.
Las horas de las reservas y del registro de uso vienen en UTC (2026-10-24T13:00:00Z); la
zona horaria del laboratorio está en /lab. Los días de from y to se toman en la hora
del laboratorio.
Los valores de los campos personalizados vienen en custom_fields, con la clave de cada
campo (la que devuelven /biobank/fields, /equipment/fields y /reagents/fields). En las listas se devuelve el texto de la
opción elegida.
Cargar y modificar datos
Con un token de Editor/a también se puede escribir. Los datos van en el cuerpo del
pedido, en JSON, con el encabezado Content-Type: application/json. Se aplican las
mismas reglas que en la web: los campos obligatorios del laboratorio, que una posición
esté libre, que haya stock para consumir, que una reserva no choque con otra.
- Historial. Cada cambio queda en el historial del registro con tu nombre y «vía API · <nombre del token>». Lo ve cualquiera que abra el registro en la web.
- Códigos. Los códigos nuevos (muestras, equipos, insumos, lotes) los asigna Vialo con el formato del laboratorio. La respuesta trae el registro creado, con su código y su id.
- Campos personalizados. Van en
custom_fields, con la clave de cada campo. En las listas se puede mandar el texto de la opción («EDTA»). Al editar, solo cambian las claves que mandás;nullborra un valor. - Versión. Para editar (
PATCH) hay que mandar laversionque devolvió la API al leer el registro. Si otra persona lo cambió mientras tanto, la respuesta es409y no se pisa nada: volvé a leerlo y decidí. - Reintentos sin duplicar. En los
POSTpodés mandar el encabezadoIdempotency-Keycon una clave única por operación (por ejemplo un UUID). Si el pedido se repite con la misma clave en las 24 horas siguientes (porque se cortó la conexión, por ejemplo), no se vuelve a ejecutar: recibís la primera respuesta, con el encabezadoIdempotent-Replayed: true. - Borrar. Solo se pueden borrar muestras (
DELETE), y es un borrado lógico: la administración las puede restaurar desde «Borradas». Los asistentes de IA no borran.
Biobanco
| Pedido | Qué hace |
|---|---|
POST /biobank/samples | Carga hasta 100 muestras en samples. Se crean todas o ninguna. |
PATCH /biobank/samples/PL-2026-00042 | Cambia tipo, donante, fecha, cantidad, unidad, notas o campos personalizados. |
POST /biobank/samples/<id>/move | La guarda en una caja (box_id, position como «B4») o la deja sin ubicar (box_id: null). |
POST /biobank/samples/<id>/status | Cambia el estado. Agotada, descartada y transferida liberan su lugar. |
POST /biobank/samples/<id>/aliquots | Crea alícuotas (count, quantity, unit, box_id). |
DELETE /biobank/samples/<id> | Borra la muestra (se puede restaurar). |
Con una caja y sin position, cada muestra va al primer lugar libre. El type va por
nombre o por id (ver /biobank/sample-types) y la caja por su id (ver
/biobank/locations).
Equipos
| Pedido | Qué hace |
|---|---|
POST /equipment/items | Da de alta un equipo (name, type y el resto de sus datos). |
PATCH /equipment/items/EQ-0004 | Cambia datos del equipo, su estado, responsable o servicio técnico. |
POST /equipment/items/<id>/events | Registra un mantenimiento, calibración (con result y valid_until), verificación, limpieza, reparación o nota. |
POST /equipment/items/<id>/failures | Reporta una falla (detail, severity, take_out_of_service). |
POST /equipment/failures/<id>/resolve | Cierra una falla (resolution) y, si no quedan otras abiertas, lo vuelve a poner en servicio. |
POST /equipment/bookings | Reserva un equipo (starts_at, ends_at; con repeat, se repite cada semana, día hábil o día). |
POST /equipment/bookings/<id>/cancel | Cancela una reserva (con scope: "following", también las siguientes de la serie). |
POST /equipment/items/<id>/usage | Registra un uso ya terminado (started_at, ended_at); con outcome: "problem", abre una falla. |
Las horas van como instantes ISO 8601 con zona (2026-10-24T10:00:00-03:00). Las personas
(responsable, quién lo hizo, para quién es la reserva) se indican por id, nombre o email.
Por API, reservar, registrar usos y reportar fallas también piden un token de Editor/a.
Insumos
| Pedido | Qué hace |
|---|---|
POST /reagents/items | Da de alta un insumo (name, unit y el resto de sus datos). |
PATCH /reagents/items/RE-0003 | Cambia datos del insumo, su punto de pedido o lo archiva (archived: true). |
POST /reagents/lots | Registra un ingreso: item, quantity (el total), containers, lote, vencimiento y lugar. |
POST /reagents/lots/<lote>/consume | Registra un consumo (quantity, purpose). |
POST /reagents/lots/<lote>/discard | Descarta el lote o una parte, con su motivo (reason). |
POST /reagents/lots/<lote>/adjust | Deja el lote con la cantidad contada, con su motivo. |
POST /reagents/lots/<lote>/transfer | Lleva el lote, o una parte, a otro lugar. |
POST /reagents/movements/<id>/void | Anula un movimiento cargado por error, con su motivo. |
POST /reagents/orders | Pide un insumo. Si ya hay un pedido abierto para ese insumo, no lo duplica. |
POST /reagents/orders/<id>/ordered | Marca que el pedido se hizo al proveedor (fecha, llegada estimada, referencia). |
POST /reagents/orders/<id>/close | Cierra un pedido como recibido o cancelado. |
Los lotes se indican por su id o por su código interno. Un lote vencido pide
confirm_expired: true para consumirlo, y las sustancias controladas piden reason en
cada movimiento, igual que en la web.
Monitoreo
| Pedido | Qué hace |
|---|---|
PATCH /monitoring/sensors/<id> | Cambia el nombre, el rango (min_value, max_value), las demoras o lo desconecta (archived: true). |
POST /monitoring/alarms/<id>/acknowledge | Anota qué se hizo con una alarma (note), a tu nombre. Cada alarma se registra una sola vez. |
Conectar un sensor nuevo y generar su clave se hace solo desde la web: la clave se muestra una vez y no conviene que pase por scripts ni asistentes.
Ejemplos
Probar el token
curl -H "Authorization: Bearer trz_tu_token" https://vialo.ejemplo.org/api/v1/lab
Python: todas las muestras de plasma disponibles
import requests
API = "https://vialo.ejemplo.org/api/v1"
HEADERS = {"Authorization": "Bearer trz_tu_token"}
muestras, pagina = [], 1
while True:
r = requests.get(
f"{API}/biobank/samples",
headers=HEADERS,
params={"type": "Plasma", "status": "available", "limit": 200, "page": pagina},
)
r.raise_for_status()
datos = r.json()
muestras += datos["data"]
if pagina * datos["limit"] >= datos["total"]:
break
pagina += 1
for m in muestras:
lugar = m["placement"]
print(m["code"], lugar["path"] + " · " + lugar["position"] if lugar else "sin ubicar")
Python: cargar las muestras de una corrida
import csv, uuid, requests
API = "https://vialo.ejemplo.org/api/v1"
HEADERS = {"Authorization": "Bearer trz_token_de_editor"}
with open("corrida.csv", newline="", encoding="utf-8") as f:
muestras = [
{
"type": "Plasma",
"donor_code": fila["donante"],
"collection_date": fila["fecha"], # AAAA-MM-DD
"quantity": float(fila["volumen"]),
"box_id": "<id de la caja>", # va al primer lugar libre
"custom_fields": {"anticoagulante": "EDTA"},
}
for fila in csv.DictReader(f)
]
r = requests.post(
f"{API}/biobank/samples",
headers={**HEADERS, "Idempotency-Key": str(uuid.uuid4())},
json={"samples": muestras[:100]}, # hasta 100 por pedido
)
if r.status_code != 201:
print(r.json()["error"]) # el mensaje dice qué fila y qué campo revisar
else:
for m in r.json()["data"]:
print(m["code"], m["placement"]["position"] if m["placement"] else "sin ubicar")
Corregir un dato
curl -X PATCH https://vialo.ejemplo.org/api/v1/biobank/samples/PL-2026-00042 -H "Authorization: Bearer trz_token_de_editor" -H "Content-Type: application/json" -d '{"version": 3, "quantity": 180, "custom_fields": {"hemolisis": "Leve"}}'
Excel: una tabla que se actualiza
- En Excel, Datos → Obtener datos → De otras fuentes → Desde la web.
- Elegí Avanzado y pegá la dirección, por ejemplo
https://vialo.ejemplo.org/api/v1/biobank/samples?limit=200. - En Parámetros de encabezado de solicitud HTTP, escribí
Authorizationy, al lado,Bearer trz_tu_token. - En el editor que se abre, expandí la columna
datapara tener una fila por muestra. Con Actualizar se vuelven a traer los datos.
El token queda guardado en el archivo de Excel. Usá uno de Lector/a creado solo para esa planilla y no la compartas fuera del laboratorio.
Límites y errores
Cada token puede hacer 60 pedidos por minuto para consultar y 20 por minuto para
cargar o modificar (se cuentan por separado). Si se pasa, la respuesta dice cuántos
segundos esperar. El cuerpo de un pedido puede tener hasta 1 MB. Las respuestas traen los encabezados X-RateLimit-Remaining (pedidos
que quedan) y X-RateLimit-Reset (cuándo se renueva el minuto).
Cuando algo sale mal, la respuesta trae un código y un mensaje en español:
| Código | Qué pasó |
|---|---|
unauthorized (401) | Falta el token, está mal copiado, se revocó, venció o la API está apagada. |
forbidden (403) | El token no tiene el permiso necesario (por ejemplo, Lector/a cargando). |
read_only (403) | El laboratorio está en solo lectura (terminó la prueba o no tiene plan): se lee y exporta, pero no se carga. |
not_found (404) | No existe en este laboratorio (o el módulo no está habilitado). |
validation_failed (400) | Algún dato está mal: el mensaje dice cuál y details el campo. |
conflict (409) | Otra persona cambió el registro (mandá la version nueva) o ya existe. |
payload_too_large (413) | El cuerpo pasa de 1 MB: mandá los datos en varios pedidos. |
rate_limited (429) | Se pasó el límite de pedidos por minuto. |
Sensores de temperatura
Los sensores de heladeras y freezers no usan un token de persona: cada sensor tiene su
propia clave (empieza con vsn_), que se genera en Vialo al conectarlo en el módulo
Monitoreo. La clave no vence y solo sirve para cargar lecturas de ese sensor; no hace
falta encender el acceso por API.
POST /api/v1/monitoring/readings
Authorization: Bearer vsn_… (o X-Sensor-Key: vsn_…)
Content-Type: application/json
{ "value": -18.4 }
Para mandar varias lecturas con su hora (por ejemplo, las que el dispositivo guardó sin
conexión): { "readings": [{ "measured_at": "2026-10-25T10:00:00Z", "value": -18.4 }, …] }.
measured_at es opcional (ISO o segundos desde 1970); sin hora se usa la de llegada. Hasta
500 lecturas por pedido y 30 pedidos por minuto por sensor. Una lectura con la misma hora
que otra ya guardada se ignora, así que reintentar es seguro. La respuesta dice cuántas
llegaron y cuántas eran nuevas:
{ "sensor_id": "…", "received": 1, "accepted": 1, "duplicates": 0 }
Las alarmas (fuera de rango más tiempo que la demora del sensor) y el aviso de «sin datos» los calcula Vialo. Hay un ejemplo para armar un sensor con un ESP32 en la guía Armar o conectar un sensor del centro de ayuda.
Para consultar las temperaturas y las alarmas, o anotar qué se hizo con una alarma, desde un script o un asistente de IA, se usa un token de persona como en el resto de la API (ver Sensores y alarmas y Monitoreo).
Asistentes de IA (MCP)
El mismo token sirve para conectar un asistente de IA (Claude, Cursor, VS Code y otros compatibles con MCP) y pedirle cosas sobre el laboratorio en lenguaje natural:
- «¿Dónde están las alícuotas de plasma del donante PAC-0012?»
- «¿Cuántos lugares libres quedan en la caja de ácidos nucleicos?»
- «¿Quién movió la muestra PL-2026-00042 y cuándo?»
- «Listame las muestras de suero extraídas en marzo que siguen disponibles.»
- «¿Qué calibraciones vencen este mes y quién se ocupa de cada una?»
- «¿Está libre la centrífuga refrigerada mañana a las 10?»
- «¿Qué reactivos vencen este mes y en qué heladera están?»
- «¿Qué hay que pedir esta semana y a qué proveedor?»
- «¿Cómo están las temperaturas de los freezers? ¿Hubo alarmas esta semana?»
Con un token de Editor/a, también le podés pedir que cargue o modifique:
- «Cargá estas 12 muestras de plasma del donante PAC-0031 en la caja 4.»
- «Registrá la calibración de la balanza EQ-0007 de hoy: conforme, válida por un año.»
- «Usé 2 frascos de etanol 96 %: descontalos del lote que vence primero.»
- «Pedí 10 cajas de puntas de 200 µL al proveedor de siempre.»
- «Registrá la alarma de la heladera EQ-0003: quedó la puerta abierta, la cerramos y volvió a rango en 20 minutos.»
Antes de cada cambio, el asistente te dice qué va a hacer y tu programa (Claude, Cursor…) te pide confirmación. Lo que haga queda en el historial a tu nombre, «vía MCP». No puede borrar nada. Con un token de Lector/a, el asistente solo consulta: ni siquiera ve las herramientas para cargar.
El asistente ve solo este laboratorio, con el permiso del token, y solo los módulos habilitados.
La dirección del servidor MCP es la de Vialo seguida de /api/mcp, por ejemplo
https://vialo.ejemplo.org/api/mcp.
Con qué Claude se puede usar
| Dónde usás Claude | ¿Se conecta? | Cómo |
|---|---|---|
| Claude Desktop, la app de escritorio (Windows o Mac) | Sí | Con un archivo de configuración y Node.js. Ver abajo. |
| Claude Code, en la terminal o en la pestaña Code de la app | Sí | Con un comando. Ver abajo. |
| Claude en el navegador (claude.ai) y la app del celular | Todavía no | Los conectores web piden otro tipo de autorización (OAuth). |
En Claude Desktop, Configuración → Conectores → Agregar conector personalizado tampoco sirve por ahora, por lo mismo: no deja mandar el token. Usá el archivo de configuración. Si tu laboratorio necesita los conectores web, pedíselo a la administración de Vialo.
Antes de empezar
- La API tiene que estar encendida en el laboratorio (ver Encender la API).
- Creá un token solo para Claude, con un nombre que diga dónde lo usás, por ejemplo «Claude Desktop · notebook». Si cambiás de computadora o la perdés, revocás solo ese. Elegí Lector/a si solo vas a consultar y Editor/a si querés que también cargue datos.
- Tené a mano la dirección de Vialo de tu laboratorio: la que ves en el navegador al
entrar, hasta el dominio (
https://vialo.ejemplo.org). La del servidor MCP es esa misma seguida de/api/mcp.
Claude Desktop, paso a paso
-
Instalá Node.js. Claude Desktop se conecta a Vialo a través de un programa chico (
mcp-remote) que necesita Node.js. Bajá la versión LTS e instalala con las opciones que trae. Para comprobarlo, abrí una terminal (en Windows, PowerShell o «Símbolo del sistema»; en Mac, Terminal) y escribínode -v: tiene que mostrar un número de versión. -
Abrí la configuración. En Claude Desktop, andá a Configuración → Desarrollador y tocá Editar configuración. Se abre la carpeta del archivo
claude_desktop_config.json; abrilo con un editor de texto (el Bloc de notas sirve). El archivo está en:- Windows:
%APPDATA%\Claude\claude_desktop_config.json - Mac:
~/Library/Application Support/Claude/claude_desktop_config.json
- Windows:
-
Pegá la configuración. Si el archivo está vacío o solo tiene
{}, reemplazalo por esto, con la dirección de tu laboratorio y tu token:{ "mcpServers": { "vialo": { "command": "npx", "args": [ "-y", "mcp-remote", "https://vialo.ejemplo.org/api/mcp", "--header", "Authorization:${VIALO_TOKEN}" ], "env": { "VIALO_TOKEN": "Bearer trz_tu_token" } } } }Si el archivo ya tiene otras cosas, no las borres: agregá el bloque
"vialo": { … }dentro demcpServers(separado de los demás servidores con una coma), o creámcpServerssi no está.Dejá
Authorization:${VIALO_TOKEN}tal cual, sin espacios. El token va solo enenv, después deBearery un espacio. Así se evita un problema de Windows con los espacios en los argumentos. -
Guardá y cerrá Claude del todo. Cerrar la ventana no alcanza. En Windows, hacé clic derecho en el ícono de Claude junto al reloj y elegí Salir; en Mac, Claude → Salir (⌘Q). Después volvé a abrirlo.
-
Comprobá que conectó. En Configuración → Desarrollador tiene que aparecer vialo como running. En una conversación nueva, abrí el menú de herramientas del cuadro de texto: tiene que estar vialo, con sus herramientas.
La primera vez que Claude usa cada herramienta, te pide permiso: Permitir una vez o Permitir siempre. Para las que consultan podés elegir siempre; para las que cargan o modifican, conviene una vez, así ves cada cambio antes de que se haga.
Claude Code
En una terminal:
claude mcp add --transport http --scope user vialo https://vialo.ejemplo.org/api/mcp --header "Authorization: Bearer trz_tu_token"
Con --scope user queda disponible en todas tus carpetas; sin eso, solo en la carpeta
donde corriste el comando. La pestaña Code de la app de escritorio usa esta misma
configuración.
Para ver si conectó, corré claude mcp list (tiene que decir que vialo está
conectado) o escribí /mcp dentro de Claude Code. Para sacarlo, claude mcp remove vialo.
Para dejar la configuración en un proyecto que comparte un equipo, sin escribir el token
en el archivo, usá un .mcp.json en la carpeta del proyecto. Cada persona define la
variable de entorno VIALO_TOKEN con su propio token:
{
"mcpServers": {
"vialo": {
"type": "http",
"url": "https://vialo.ejemplo.org/api/mcp",
"headers": { "Authorization": "Bearer ${VIALO_TOKEN}" }
}
}
}
Probar la conexión
Empezá con una pregunta que no toca datos:
- «¿A qué laboratorio de Vialo estás conectado y qué podés hacer?»
Claude usa laboratorio_ver y responde con el nombre del laboratorio, los módulos
habilitados y si el acceso es solo de consulta o también de carga. Después probá con algo
real, como «¿Qué calibraciones vencen este mes?».
Cómo sacarle provecho
- Pedí como se lo pedirías a alguien del laboratorio. Claude busca, cruza y resume: «Armame una tabla con los equipos que tienen una falla abierta, desde cuándo y quién la reportó».
- Usá los códigos. Si nombrás
PL-2026-00042oEQ-0004, va directo a ese registro. - Leé antes de confirmar. Antes de cargar algo, Claude te dice qué va a hacer. Si falta un dato obligatorio, te lo pregunta en vez de inventarlo.
- Acotá lo que pedís. «Revisá todas las muestras» gasta muchas consultas; «las de plasma de 2026 que siguen disponibles» llega antes y con menos pedidos.
- Usá un proyecto. En Claude Desktop podés armar un Proyecto para el laboratorio y dejar en sus instrucciones lo que Claude tiene que saber siempre, por ejemplo «Si no te digo otra cosa, las muestras nuevas van a la caja 4 del freezer de −80 °C».
- Varios laboratorios. Cada token es de un solo laboratorio. Si trabajás en más de uno,
creá un token en cada uno y agregá un servidor por laboratorio, con nombres distintos
(
vialo-biobanco,vialo-genetica). - Cuando el token vence, Claude deja de conectarse. Creá uno nuevo, reemplazalo en la configuración y reiniciá Claude.
El token queda guardado en un archivo de tu computadora. No lo configures en una computadora compartida y, si dejás de usarla, revocalo desde Acceso por API.
Si algo no anda
| Qué pasa | Qué hacer |
|---|---|
| vialo no aparece en Claude Desktop | Revisá que el archivo esté bien escrito (una coma de más o de menos lo rompe) y que hayas cerrado Claude del todo antes de volver a abrirlo. |
| Aparece como failed o se desconecta | Mirá el registro: en Windows, %APPDATA%\Claude\logs\mcp-server-vialo.log; en Mac, ~/Library/Logs/Claude/mcp-server-vialo.log. |
El registro dice que no encuentra npx | Falta Node.js, o hay que reiniciar la computadora después de instalarlo. |
unauthorized (401) | El token está mal copiado, venció, se revocó o la API está apagada. En Claude Desktop, revisá que en env diga Bearer y un espacio antes del token. |
forbidden (403), o no están las herramientas para cargar | El token es de Lector/a. Para cargar, creá uno de Editor/a. |
read_only (403) al cargar | El laboratorio está en solo lectura: terminó la prueba o no tiene plan. La administración del laboratorio tiene que elegir uno; mientras tanto se puede consultar todo. |
| Faltan las herramientas de un módulo | Ese módulo no está habilitado en el laboratorio. |
rate_limited (429) | Claude hizo muchas consultas seguidas. Esperá un minuto y acotá el pedido. |
| Responde sin consultar Vialo | Fijate que vialo esté encendido en el menú de herramientas de esa conversación y pedíselo explícito: «buscalo en Vialo». |
Cursor
En .cursor/mcp.json (del proyecto) o en la configuración de MCP de Cursor:
{
"mcpServers": {
"vialo": {
"url": "https://vialo.ejemplo.org/api/mcp",
"headers": { "Authorization": "Bearer trz_tu_token" }
}
}
}
VS Code
En .vscode/mcp.json:
{
"servers": {
"vialo": {
"type": "http",
"url": "https://vialo.ejemplo.org/api/mcp",
"headers": { "Authorization": "Bearer trz_tu_token" }
}
}
}
ChatGPT todavía no se puede conectar: pide OAuth, igual que los conectores web de Claude.
Qué puede hacer el asistente
Para consultar:
| Herramienta | Para qué |
|---|---|
laboratorio_ver | Qué laboratorio es, su logo, su plan (y si está en solo lectura) y qué puede hacer el acceso. |
muestras_buscar | Buscar muestras por texto, tipo, estado, ubicación, donante o fecha. |
muestra_ver | Todos los datos de una muestra, con sus alícuotas. |
muestra_historial | Quién cambió qué y cuándo. |
ubicaciones_ver | Salas, equipos, racks y cajas, con los lugares libres. |
caja_ver | La grilla de una caja: qué hay en cada posición. |
tipos_de_muestra_ver | Los tipos de muestra. |
campos_ver | Qué significa cada campo, incluidos los del laboratorio. |
equipos_buscar | Buscar equipos por texto, tipo, estado, sala o lo que necesita atención. |
equipo_ver | Un equipo con su plan de mantenimiento, sus vencimientos y sus fallas. |
equipo_registro | Lo que se le hizo a un equipo: mantenimientos, calibraciones, fallas. |
vencimientos_ver | Lo vencido y lo que está por vencer en todos los equipos. |
fallas_ver | Las fallas abiertas. |
reservas_ver | Las reservas de unos días, para saber si un equipo está libre. |
uso_ver | Quién usó los equipos y cuántas horas. |
tipos_de_equipo_ver | Los tipos de equipo. |
campos_de_equipo_ver | Qué significa cada campo de un equipo. |
insumos_buscar | Buscar insumos por texto, categoría, lugar, proveedor o lo que necesita atención. |
insumo_ver | Un insumo con su stock, sus lotes y su pedido abierto. |
insumo_movimientos | Los movimientos de un insumo. |
insumos_vencimientos | Los lotes vencidos o por vencer que siguen en stock. |
insumos_para_pedir | Lo que hay que pedir, con la cantidad sugerida y el proveedor. |
pedidos_ver | Los pedidos abiertos o cerrados. |
libro_de_movimientos_ver | El libro de movimientos del laboratorio (también el de controladas). |
lugares_de_insumos_ver | Los lugares de guardado, en árbol. |
proveedores_de_insumos_ver | Los proveedores, con su contacto. |
categorias_de_insumos_ver | Las categorías de insumos. |
campos_de_insumo_ver | Qué significa cada campo de un insumo y de un lote. |
sensores_ver | Las temperaturas ahora: en rango, fuera de rango, en alarma o sin datos. |
sensor_ver | Un sensor, con la mínima y la máxima de un período y sus alarmas. |
sensor_lecturas | Cómo evolucionó la temperatura de un sensor en un período. |
alarmas_ver | Las alarmas de temperatura, con lo que se hizo (o las que faltan registrar). |
Para cargar y modificar (solo con un token de Editor/a):
| Herramienta | Para qué |
|---|---|
muestras_crear | Cargar muestras, en una caja o sin ubicar. |
muestra_editar | Corregir los datos de una muestra. |
muestra_mover | Guardarla en otra caja o posición. |
muestra_cambiar_estado | Marcarla en uso, agotada, descartada o transferida. |
alicuotas_crear | Crear alícuotas de una muestra. |
equipo_crear | Dar de alta un equipo. |
equipo_editar | Cambiar los datos o el estado de un equipo. |
equipo_registrar | Registrar un mantenimiento, calibración, verificación, limpieza, reparación o nota. |
falla_reportar | Reportar una falla y, si hace falta, sacar el equipo de servicio. |
falla_cerrar | Cerrar una falla y volver a poner el equipo en servicio. |
reserva_crear | Reservar un equipo, una vez o repetida. |
reserva_cancelar | Cancelar una reserva (o la serie). |
uso_registrar | Registrar un uso de un equipo. |
insumo_crear | Dar de alta un insumo. |
insumo_editar | Cambiar los datos de un insumo. |
lote_ingresar | Registrar lo que llegó. |
insumo_usar | Registrar un consumo. Con el insumo solo, usa el lote que vence primero. |
lote_descartar | Descartar un lote o una parte. |
lote_ajustar | Ajustar un lote al recuento. |
lote_trasladar | Llevar un lote a otro lugar. |
movimiento_anular | Anular un movimiento cargado por error. |
pedido_crear | Pedir un insumo. |
pedido_marcar_hecho | Marcar que el pedido se hizo al proveedor. |
pedido_cerrar | Cerrar un pedido como recibido o cancelado. |
alarma_registrar | Anotar qué se hizo con una alarma de temperatura (la acción correctiva). |
sensor_editar | Cambiar el nombre, el rango o las demoras de un sensor. |
El asistente solo ve las herramientas de los módulos habilitados en el laboratorio.
Cada consulta del asistente cuenta para el límite de 60 pedidos por minuto del token, y cada carga o cambio, para el de 20.
Lo que le preguntás al asistente y lo que Vialo le responde pasa por el servicio de IA que uses (Anthropic, OpenAI, etc.). Antes de conectarlo, confirmá que tu institución permite compartir esos datos con ese servicio. Los códigos de donante están pseudonimizados, pero el resto de los datos de las muestras sí se envía.