Documentación

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

  1. 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.
  2. 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.
  3. 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ónQué devuelve
/labEl laboratorio, su logo, su plan (subscription, con can_write) y qué puede hacer el token. Sirve para probar que anda.
/biobank/samplesMuestras, con filtros (ver abajo). Hasta 200 por página.
/biobank/samples/PL-2026-00042Una muestra por su código (o su id), con su ubicación y sus alícuotas.
/biobank/samples/<id>/historyEl historial de cambios de una muestra.
/biobank/samples/<id>/attachmentsLos adjuntos, con un enlace de descarga que vence a los 5 minutos.
/biobank/locationsSalas, 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-typesLos tipos de muestra.
/biobank/fieldsLos campos de la muestra, incluidos los personalizados del laboratorio.
/equipment/itemsEquipos, con filtros (ver abajo). Hasta 200 por página.
/equipment/items/EQ-0004Un equipo por su código (o su id), con su plan de mantenimiento y sus fallas abiertas.
/equipment/items/<id>/eventsEl registro del equipo: mantenimientos, calibraciones, fallas, reparaciones.
/equipment/items/<id>/historyEl historial de cambios de los datos del equipo.
/equipment/items/<id>/attachmentsManuales y certificados, con un enlace de descarga que vence a los 5 minutos.
/equipment/dueLo vencido y lo que está por vencer de todos los equipos (status, until).
/equipment/failuresLas fallas abiertas de todos los equipos.
/equipment/bookingsReservas de un rango de días (from, to, equipment).
/equipment/usageRegistro de uso de un rango de días (from, to, equipment).
/equipment/typesLos tipos de equipo.
/equipment/providersLos proveedores de servicio técnico, con su contacto.
/equipment/fieldsLos campos del equipo, incluidos los personalizados del laboratorio.
/reagents/itemsInsumos (reactivos, kits, plásticos, descartables), con su stock y filtros (ver abajo).
/reagents/items/RE-0003Un insumo por su código (o su id), con su stock, sus lotes y si tiene un pedido abierto.
/reagents/items/<id>/movementsIngresos, consumos, descartes, ajustes y traslados de un insumo.
/reagents/items/<id>/historyEl historial de cambios de los datos del insumo.
/reagents/items/<id>/attachmentsFichas de seguridad y certificados, con un enlace de descarga que vence a los 5 minutos.
/reagents/lotsLotes vencidos o por vencer que siguen en stock (status, until, q).
/reagents/movementsEl libro de movimientos del laboratorio (item, kind, from, to, controlled).
/reagents/to-orderLo que llegó al punto de pedido y todavía no se pidió, con la cantidad sugerida.
/reagents/ordersPedidos abiertos (o cerrados, con open=false).
/reagents/placesLugares de guardado, en árbol (path: «Sala › Heladera › Estante 1»).
/reagents/categoriesLas categorías de insumos.
/reagents/suppliersLos proveedores, con su contacto.
/reagents/fieldsLos campos del insumo y del lote, incluidos los personalizados del laboratorio.
/monitoring/sensorsLos 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>/readingsLas lecturas de un período, resumidas por tramos para graficar (points).
/monitoring/sensors/<id>/historyQuién lo conectó, le cambió el rango o lo desconectó.
/monitoring/alarmsLas 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.

FiltroEjemploQué hace
qq=PAC-0012Busca en el código, el donante, las notas y los campos de texto.
typetype=Plasma,SueroTipos de muestra, por nombre o id.
statusstatus=available,in_useEstados: available, in_use, depleted, discarded, transferred.
locationlocation=<id del freezer>Lo que está en esa ubicación, incluido lo que hay adentro.
donordonor=PAC-00Parte del código de paciente o donante.
collected_from, collected_tocollected_from=2026-01-01Fecha de extracción, desde y hasta (AAAA-MM-DD).
created_from, created_tocreated_to=2026-06-30Fecha de carga, desde y hasta.
sortsort=-collection_dateOrden. Con - adelante, de mayor a menor.
page, limitpage=2&limit=200Página y resultados por página.

Filtros de equipos

FiltroEjemploQué hace
qq=EppendorfBusca en el código, el nombre, la marca, el modelo y los números de serie e inventario.
typetype=CentrífugaTipos de equipo, por nombre o id.
statusstatus=out_of_serviceEstados: in_service, out_of_service, retired.
roomroom=Sala 2Salas.
attentionattention=overduedue (vencido o por vencer), overdue (vencido) u open_failure (con una falla abierta).
sortsort=next_dueOrden. Con - adelante, de mayor a menor.
page, limitpage=2&limit=200Página y resultados por página.

Filtros de insumos

FiltroEjemploQué hace
qq=etanolBusca 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.
categorycategory=PlásticosCategorías, por nombre o id.
placeplace=Heladera 2Lugares, por nombre, camino o id, incluido lo que tienen adentro.
suppliersupplier=BiodynamicsProveedor habitual, por nombre o id.
storagestorage=fridgeConservación: room_temp, fridge, freezer_20, freezer_80, ln2, other.
attentionattention=reorderany, reorder (en el punto de pedido), due (lotes vencidos o por vencer), expired u out (sin stock).
controlledcontrolled=yesyes: solo las sustancias controladas; no: sin ellas.
archivedarchived=includeinclude suma los archivados; only, solo ellos.
sortsort=next_expiryOrden. Con - adelante, de mayor a menor.
page, limitpage=2&limit=200Pá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; null borra un valor.
  • Versión. Para editar (PATCH) hay que mandar la version que devolvió la API al leer el registro. Si otra persona lo cambió mientras tanto, la respuesta es 409 y no se pisa nada: volvé a leerlo y decidí.
  • Reintentos sin duplicar. En los POST podés mandar el encabezado Idempotency-Key con 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 encabezado Idempotent-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

PedidoQué hace
POST /biobank/samplesCarga hasta 100 muestras en samples. Se crean todas o ninguna.
PATCH /biobank/samples/PL-2026-00042Cambia tipo, donante, fecha, cantidad, unidad, notas o campos personalizados.
POST /biobank/samples/<id>/moveLa guarda en una caja (box_id, position como «B4») o la deja sin ubicar (box_id: null).
POST /biobank/samples/<id>/statusCambia el estado. Agotada, descartada y transferida liberan su lugar.
POST /biobank/samples/<id>/aliquotsCrea 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

PedidoQué hace
POST /equipment/itemsDa de alta un equipo (name, type y el resto de sus datos).
PATCH /equipment/items/EQ-0004Cambia datos del equipo, su estado, responsable o servicio técnico.
POST /equipment/items/<id>/eventsRegistra un mantenimiento, calibración (con result y valid_until), verificación, limpieza, reparación o nota.
POST /equipment/items/<id>/failuresReporta una falla (detail, severity, take_out_of_service).
POST /equipment/failures/<id>/resolveCierra una falla (resolution) y, si no quedan otras abiertas, lo vuelve a poner en servicio.
POST /equipment/bookingsReserva un equipo (starts_at, ends_at; con repeat, se repite cada semana, día hábil o día).
POST /equipment/bookings/<id>/cancelCancela una reserva (con scope: "following", también las siguientes de la serie).
POST /equipment/items/<id>/usageRegistra 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

PedidoQué hace
POST /reagents/itemsDa de alta un insumo (name, unit y el resto de sus datos).
PATCH /reagents/items/RE-0003Cambia datos del insumo, su punto de pedido o lo archiva (archived: true).
POST /reagents/lotsRegistra un ingreso: item, quantity (el total), containers, lote, vencimiento y lugar.
POST /reagents/lots/<lote>/consumeRegistra un consumo (quantity, purpose).
POST /reagents/lots/<lote>/discardDescarta el lote o una parte, con su motivo (reason).
POST /reagents/lots/<lote>/adjustDeja el lote con la cantidad contada, con su motivo.
POST /reagents/lots/<lote>/transferLleva el lote, o una parte, a otro lugar.
POST /reagents/movements/<id>/voidAnula un movimiento cargado por error, con su motivo.
POST /reagents/ordersPide un insumo. Si ya hay un pedido abierto para ese insumo, no lo duplica.
POST /reagents/orders/<id>/orderedMarca que el pedido se hizo al proveedor (fecha, llegada estimada, referencia).
POST /reagents/orders/<id>/closeCierra 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

PedidoQué 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>/acknowledgeAnota 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

  1. En Excel, Datos → Obtener datos → De otras fuentes → Desde la web.
  2. Elegí Avanzado y pegá la dirección, por ejemplo https://vialo.ejemplo.org/api/v1/biobank/samples?limit=200.
  3. En Parámetros de encabezado de solicitud HTTP, escribí Authorization y, al lado, Bearer trz_tu_token.
  4. En el editor que se abre, expandí la columna data para 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ódigoQué 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 appSíCon un comando. Ver abajo.
Claude en el navegador (claude.ai) y la app del celularTodavía noLos 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

  1. La API tiene que estar encendida en el laboratorio (ver Encender la API).
  2. 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.
  3. 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

  1. 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.

  2. 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
  3. 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 de mcpServers (separado de los demás servidores con una coma), o creá mcpServers si no está.

    Dejá Authorization:${VIALO_TOKEN} tal cual, sin espacios. El token va solo en env, después de Bearer y un espacio. Así se evita un problema de Windows con los espacios en los argumentos.

  4. 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.

  5. 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-00042 o EQ-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é pasaQué hacer
vialo no aparece en Claude DesktopRevisá 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 desconectaMirá 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 npxFalta 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 cargarEl token es de Lector/a. Para cargar, creá uno de Editor/a.
read_only (403) al cargarEl 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óduloEse 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 VialoFijate 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:

HerramientaPara qué
laboratorio_verQué laboratorio es, su logo, su plan (y si está en solo lectura) y qué puede hacer el acceso.
muestras_buscarBuscar muestras por texto, tipo, estado, ubicación, donante o fecha.
muestra_verTodos los datos de una muestra, con sus alícuotas.
muestra_historialQuién cambió qué y cuándo.
ubicaciones_verSalas, equipos, racks y cajas, con los lugares libres.
caja_verLa grilla de una caja: qué hay en cada posición.
tipos_de_muestra_verLos tipos de muestra.
campos_verQué significa cada campo, incluidos los del laboratorio.
equipos_buscarBuscar equipos por texto, tipo, estado, sala o lo que necesita atención.
equipo_verUn equipo con su plan de mantenimiento, sus vencimientos y sus fallas.
equipo_registroLo que se le hizo a un equipo: mantenimientos, calibraciones, fallas.
vencimientos_verLo vencido y lo que está por vencer en todos los equipos.
fallas_verLas fallas abiertas.
reservas_verLas reservas de unos días, para saber si un equipo está libre.
uso_verQuién usó los equipos y cuántas horas.
tipos_de_equipo_verLos tipos de equipo.
campos_de_equipo_verQué significa cada campo de un equipo.
insumos_buscarBuscar insumos por texto, categoría, lugar, proveedor o lo que necesita atención.
insumo_verUn insumo con su stock, sus lotes y su pedido abierto.
insumo_movimientosLos movimientos de un insumo.
insumos_vencimientosLos lotes vencidos o por vencer que siguen en stock.
insumos_para_pedirLo que hay que pedir, con la cantidad sugerida y el proveedor.
pedidos_verLos pedidos abiertos o cerrados.
libro_de_movimientos_verEl libro de movimientos del laboratorio (también el de controladas).
lugares_de_insumos_verLos lugares de guardado, en árbol.
proveedores_de_insumos_verLos proveedores, con su contacto.
categorias_de_insumos_verLas categorías de insumos.
campos_de_insumo_verQué significa cada campo de un insumo y de un lote.
sensores_verLas temperaturas ahora: en rango, fuera de rango, en alarma o sin datos.
sensor_verUn sensor, con la mínima y la máxima de un período y sus alarmas.
sensor_lecturasCómo evolucionó la temperatura de un sensor en un período.
alarmas_verLas alarmas de temperatura, con lo que se hizo (o las que faltan registrar).

Para cargar y modificar (solo con un token de Editor/a):

HerramientaPara qué
muestras_crearCargar muestras, en una caja o sin ubicar.
muestra_editarCorregir los datos de una muestra.
muestra_moverGuardarla en otra caja o posición.
muestra_cambiar_estadoMarcarla en uso, agotada, descartada o transferida.
alicuotas_crearCrear alícuotas de una muestra.
equipo_crearDar de alta un equipo.
equipo_editarCambiar los datos o el estado de un equipo.
equipo_registrarRegistrar un mantenimiento, calibración, verificación, limpieza, reparación o nota.
falla_reportarReportar una falla y, si hace falta, sacar el equipo de servicio.
falla_cerrarCerrar una falla y volver a poner el equipo en servicio.
reserva_crearReservar un equipo, una vez o repetida.
reserva_cancelarCancelar una reserva (o la serie).
uso_registrarRegistrar un uso de un equipo.
insumo_crearDar de alta un insumo.
insumo_editarCambiar los datos de un insumo.
lote_ingresarRegistrar lo que llegó.
insumo_usarRegistrar un consumo. Con el insumo solo, usa el lote que vence primero.
lote_descartarDescartar un lote o una parte.
lote_ajustarAjustar un lote al recuento.
lote_trasladarLlevar un lote a otro lugar.
movimiento_anularAnular un movimiento cargado por error.
pedido_crearPedir un insumo.
pedido_marcar_hechoMarcar que el pedido se hizo al proveedor.
pedido_cerrarCerrar un pedido como recibido o cancelado.
alarma_registrarAnotar qué se hizo con una alarma de temperatura (la acción correctiva).
sensor_editarCambiar 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.