Last9 MCP Server
oficialSeamlessly bring real-time production context—logs, metrics, and traces—into your local environment to auto-fix code faster.
Documentación
Servidor MCP de Last9

Tu agente de IA no sabe qué está fallando en producción. Esto lo soluciona.
El Servidor MCP de Last9 conecta a Claude, Cursor, Windsurf y cualquier otro asistente de IA compatible con MCP directamente con tus datos de observabilidad en producción: logs, métricas, trazas, excepciones, consultas a bases de datos, alertas y despliegues. El agente deja de adivinar y empieza a leer la señal real.
Comienza en 30 segundos (Alojado)
Sin binarios que instalar. Sin tokens que gestionar. Una URL, OAuth en tu navegador, y listo.
Encuentra el slug de tu organización en tu URL de Last9: app.last9.io/<org_slug>/...
Claude Code
claude mcp add --transport http last9 https://app.last9.io/api/v4/organizations/<org_slug>/mcp
Escribe /mcp, selecciona last9, autentícate. Eso es todo.
Cursor
Configuración > MCP > Añadir nuevo servidor MCP:
{
"mcpServers": {
"last9": {
"type": "http",
"url": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
}
}
}
Haz clic en Conectar, completa OAuth.
VS Code
Requiere v1.99+. Abre la Paleta de Comandos → MCP: Añadir servidor, pega la URL, autentícate.
O directamente en settings.json:
{
"mcp": {
"servers": {
"last9": {
"type": "http",
"url": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
}
}
}
}
Windsurf
Configuración > Cascade > Abrir Mercado MCP > icono de engranaje (mcp_config.json):
{
"mcpServers": {
"last9": {
"serverUrl": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
}
}
}
Claude Web/Escritorio
Configuración > Conectores > Añadir conector personalizado. Nómbralo last9, pega la URL, autentícate.
Requiere acceso de administrador a tu organización de Claude.
Autoalojado (STDIO)
Úsalo cuando tu cliente MCP no soporte transporte HTTP, o cuando necesites que el servidor se ejecute localmente.
Instalar
Homebrew:
brew install last9/tap/last9-mcp
NPM:
npm install -g @last9/mcp-server@latest
# or directly:
npx -y @last9/mcp-server@latest
Lanzamientos binarios (Windows / manual):
Descarga desde Lanzamientos de GitHub:
| Plataforma | Archivo |
|---|---|
| Windows (x64) | last9-mcp-server_Windows_x86_64.zip |
| Windows (ARM64) | last9-mcp-server_Windows_arm64.zip |
| Linux (x64) | last9-mcp-server_Linux_x86_64.tar.gz |
| Linux (ARM64) | last9-mcp-server_Linux_arm64.tar.gz |
| macOS (x64) | last9-mcp-server_Darwin_x86_64.tar.gz |
| macOS (ARM64) | last9-mcp-server_Darwin_arm64.tar.gz |
Obtener un Token de Actualización
Solo los administradores pueden crear tokens.
- Ve a Acceso API
- Haz clic en Generar Token con permisos de Escritura
- Cópialo
Configuración del Cliente
Homebrew:
{
"mcpServers": {
"last9": {
"command": "/opt/homebrew/bin/last9-mcp",
"env": {
"LAST9_REFRESH_TOKEN": "<your_refresh_token>"
}
}
}
}
NPM:
{
"mcpServers": {
"last9": {
"command": "npx",
"args": ["-y", "@last9/mcp-server@latest"],
"env": {
"LAST9_REFRESH_TOKEN": "<your_refresh_token>"
}
}
}
}
Dónde pegar esto:
| Cliente | Ubicación |
|---|---|
| Claude Web/Escritorio | Configuración > Desarrollador > Editar Configuración (claude_desktop_config.json) |
| Cursor | Configuración > Ajustes de Cursor > MCP > Añadir nuevo servidor MCP global |
| Windsurf | Configuración > Cascade > Mercado MCP > icono de engranaje (mcp_config.json) |
| VS Code | Envuelve en { "mcp": { "servers": { ... } } } en settings.json — detalles |
Configuración STDIO de VS Code
{
"mcp": {
"servers": {
"last9": {
"type": "stdio",
"command": "/opt/homebrew/bin/last9-mcp",
"env": {
"LAST9_REFRESH_TOKEN": "<your_refresh_token>"
}
}
}
}
}
Para NPM: usa "command": "npx" y añade "args": ["-y", "@last9/mcp-server@latest"].
Windows
Después de descargar desde Lanzamientos de GitHub, extrae y apunta a la ruta completa:
{
"mcpServers": {
"last9": {
"command": "C:\\Users\\<user>\\AppData\\Local\\Programs\\last9-mcp-server.exe",
"env": {
"LAST9_REFRESH_TOKEN": "<your_refresh_token>"
}
}
}
}
La ruta de NPM es más fácil en Windows — sin gestión de rutas.
Variables de Entorno
| Variable | Predeterminado | Descripción |
|---|---|---|
LAST9_REFRESH_TOKEN | (requerido) | Token de actualización desde Acceso API |
LAST9_DATASOURCE | predeterminado de org | Nombre de fuente de datos/clúster — útil cuando tienes múltiples clústeres Levitate |
LAST9_API_HOST | app.last9.io | Anular el host de la API |
LAST9_MAX_GET_LOGS_ENTRIES | 5000 | Máximo de entradas para solicitudes fragmentadas get_logs |
LAST9_DEBUG_CHUNKING | false | Establece true para registrar detalles de planificación de fragmentos para get_logs, get_service_logs, get_traces |
LAST9_DISABLE_TELEMETRY | true | Establece false para habilitar el rastreo OTel interno |
OTEL_SDK_DISABLED | — | Variable de entorno OTel estándar. Anula LAST9_DISABLE_TELEMETRY |
OTEL_EXPORTER_OTLP_ENDPOINT | — | Endpoint del colector OTLP (solo cuando la telemetría está habilitada) |
OTEL_EXPORTER_OTLP_HEADERS | — | Cabeceras de autenticación OTLP (solo cuando la telemetría está habilitada) |
Lo Que Puede Hacer
Salud del Servicio
get_service_summary— Rendimiento, tasa de error, tiempo de respuesta p95 en todos los serviciosget_service_environments— Entornos disponibles para tus servicios. Ejecuta esto primero — otras herramientas APM necesitanenvde aquíget_service_performance_details— Desglose completo: rendimiento, tasa de error, p50/p90/p95/promedio/máx, apdex, disponibilidadget_service_operations_summary— Operaciones agrupadas por endpoints HTTP, llamadas a BD, mensajería, clientes HTTPget_service_dependency_graph— Mapa de dependencias con rendimiento, latencia y tasas de error para upstream/downstream/infraget_exceptions— Excepciones del lado del servidor con filtros de servicio y span
Observabilidad de Base de Datos
Cuatro herramientas que van directamente al rendimiento de tu base de datos, derivadas de spans de trazas de OpenTelemetry. No se necesita instrumentación adicional si ya estás usando OTel.
get_databases— Descubre todas las bases de datos en tu infraestructura: tipo de BD, host, rendimiento (consultas/min), latencia p95, tasa de error, número de servicios dependientesget_database_slow_queries— Las ejecuciones de consulta más lentas reales, ordenadas por duración, con IDs de traza para profundizar en trazas completasget_database_queries— Patrones de consulta y agregados: con qué frecuencia se ejecuta una consulta, duración promedio/p95, tasa de errorget_database_server_metrics— Métricas del lado del servidor desde el propio host de BD (CPU, conexiones, tasas de acierto de búfer — depende de tu sistema de BD)
Soporta PostgreSQL, MySQL, MongoDB, Redis, Aerospike y cualquier otra cosa con trazas OTel con un atributo db_system.
Prometheus / PromQL
prometheus_range_query— Consultas de rango PromQL sobre cualquier métricaprometheus_instant_query— Consultas instantáneas; usa funciones de resumen comoavg_over_time,sum_over_timeprometheus_label_values— Valores de etiqueta para una serie dadaprometheus_labels— Todas las etiquetas disponibles para una serie
Apúntalas a una fuente de datos/clúster diferente al predeterminado estableciendo LAST9_DATASOURCE.
Logs
get_logs— Consultas de pipeline de log JSON completas (agregaciones, filtros, extracción de campos)get_service_logs— Líneas de log sin procesar para un servicio, filtrables por severidad y contenido del cuerpoget_log_attributes— Catálogo global de atributos en el esquema de log para una ventana de tiempoget_log_attributes_for_pipeline— Campos de log realmente presentes para un pipeline en progreso (descubrimiento acotado), cada uno con sufilter_fieldexactoget_drop_rules— Reglas de descarte de log desde el Plano de Control de Last9add_drop_rule— Crear una nueva regla de descarte para reducir el volumen de log en origen
Trazas
get_traces— Consultas de pipeline de trazas JSON para búsquedas amplias y agregacionesget_service_traces— Trazas por ID de traza exacto o nombre de servicio. Úsalo cuando tengas un ID de traza — es más rápidoget_trace_attributes— Catálogo global de atributos en el esquema de trazasget_trace_attributes_for_pipeline— Atributos realmente presentes para un pipeline en progreso (descubrimiento acotado), cada uno con sufilter_fieldexactoget_trace_attribute_values— Valores distintos para un atributo de traza, opcionalmente acotado a un pipeline
Eventos de Cambio y Alertas
get_change_events— Despliegues, cambios de configuración, rollbacks. Correlaciona incidentes con lo que cambióget_alert_config— Configuraciones de reglas de alerta — buscables por nombre, severidad, tipo, etiquetasget_alerts— Alertas actualmente activas dentro de una ventana de tiempoget_alert_rule_state— Estado histórico de activación (1/0) por regla de alerta en un rango de tiempo, agrupado porrule_id. Filtrable por grupo de alerta, nombre de regla, filtros de etiqueta y estado.get_notification_channels— Canales de notificación configurados (Slack, PagerDuty, correo electrónico, etc.)
Paneles Personalizados
list_dashboards— Todos los paneles personalizados en tu organización: IDs, nombres y metadatosget_dashboard— Definición completa del panel por ID, incluyendo paneles y consultascreate_dashboard— Crear un nuevo panel personalizado con paneles, consultas y metadatosupdate_dashboard— Actualizar un panel existente por ID (los paneles de sistema de solo lectura devuelven un error)delete_dashboard— Eliminar un panel personalizado por ID
Resolución Difusa de Nombres
did_you_mean— Cuando el agente no está seguro sobre el nombre de una entidad, esto devuelve las coincidencias más cercanas de tu catálogo (servicios, entornos, hosts, bases de datos, despliegues/namespaces de K8s, trabajos). Hasta 3 sugerencias con puntuaciones de similitud. El servidor llama a esto automáticamente antes de la mayoría de las herramientas cuando una búsqueda de nombre devuelve vacío.
Cómo Funciona
Enlaces profundos en cada respuesta. Cada herramienta devuelve un campo deep_link — una URL directa al panel de Last9 para esa consulta exacta y rango de tiempo. El agente puede darte el enlace; haces clic; estás allí.
Caché de atributos en vivo. Al inicio, el servidor obtiene los nombres reales de atributos de log y traza de tus datos y los incrusta en las descripciones de las herramientas. Esto significa que el asistente de IA sabe qué campos existen en tu esquema, no solo una lista genérica. La caché se actualiza cada 2 horas.
Resultados grandes fragmentados. get_logs y get_traces manejan grandes conjuntos de resultados mediante fragmentación en lugar de truncar. El límite predeterminado es de 5000 entradas para logs; configurable a través de LAST9_MAX_GET_LOGS_ENTRIES.
Desarrollo
Modo HTTP, pruebas con curl, compilación desde fuente
Ejecutar en Modo HTTP
export LAST9_REFRESH_TOKEN="your_refresh_token"
export LAST9_HTTP=true
export LAST9_PORT=8080
./last9-mcp-server
El servidor se inicia en http://localhost:8080/mcp.
Probar con curl
MCP Streamable HTTP requiere un handshake de inicialización primero. No establezcas Mcp-Session-Id en la primera solicitud.
# Step 1: Initialize
SESSION_ID=$(curl -si -X POST http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2024-11-05",
"capabilities": {},
"clientInfo": {"name": "curl-test", "version": "1.0"}
}
}' | grep -i "^Mcp-Session-Id:" | awk '{print $2}' | tr -d '\r')
echo "Session: $SESSION_ID"
# Step 2: Send initialized notification
curl -s -X POST http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-H "Mcp-Session-Id: $SESSION_ID" \
-d '{"jsonrpc": "2.0", "method": "notifications/initialized", "params": {}}'
# Step 3: List tools
curl -s -X POST http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-H "Mcp-Session-Id: $SESSION_ID" \
-d '{"jsonrpc": "2.0", "id": 2, "method": "tools/list", "params": {}}'
# Step 4: Call a tool
curl -s -X POST http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-H "Mcp-Session-Id: $SESSION_ID" \
-d '{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "get_service_logs",
"arguments": {
"service": "your-service-name",
"lookback_minutes": 30,
"limit": 10
}
}
}'
Compilar desde Fuente
git clone https://github.com/last9/last9-mcp-server.git
cd last9-mcp-server
go build -o last9-mcp-server
LAST9_HTTP=true ./last9-mcp-server
LAST9_HTTP=true es para desarrollo local. Para uso real, el endpoint HTTP alojado es más fácil.
Referencia de Herramientas
Todos los parámetros, estándares de entrada de tiempo y detalles
Entrada de Tiempo
- Los tiempos absolutos (
start_time_iso/end_time_iso, otime_iso) tienen prioridad sobrelookback_minutes. - Para ventanas relativas: usa
lookback_minutes. - Para ventanas absolutas: usa RFC3339/ISO8601 —
2026-02-09T15:04:05Z. YYYY-MM-DD HH:MM:SSheredado se acepta solo por compatibilidad.
get_exceptions
limit(entero, opcional): Máximo de excepciones. Predeterminado: 20.lookback_minutes(entero, opcional): Predeterminado: 60.start_time_iso/end_time_iso(cadena, opcional): Rango de tiempo absoluto.service_name(cadena, opcional): Filtrar por servicio.span_name(cadena, opcional): Filtrar por nombre de span.deployment_environment(cadena, opcional): Filtrar por entorno.
get_service_summary
start_time_iso/end_time_iso(cadena, opcional)env(cadena, opcional): Predeterminado aprod.
get_service_environments
start_time_iso/end_time_iso(cadena, opcional)
Todas las demás herramientas APM requieren un valor
env. Usa""si esto devuelve vacío.
get_service_performance_details
service_name(cadena, requerido)lookback_minutes(entero, opcional): Predeterminado: 60.start_time_iso/end_time_iso(cadena, opcional)env(cadena, opcional): Predeterminado aprod.
get_service_operations_summary
service_name(cadena, obligatorio)lookback_minutes(entero, opcional): Valor predeterminado: 60.start_time_iso/end_time_iso(cadena, opcional)env(cadena, opcional): Valor predeterminado:prod.
get_service_dependency_graph
service_name(cadena, opcional)lookback_minutes(entero, opcional): Valor predeterminado: 60.start_time_iso/end_time_iso(cadena, opcional)env(cadena, opcional): Valor predeterminado:prod.
get_databases
env(cadena, opcional): Filtrar por entorno. Valor predeterminado: todos.lookback_minutes(entero, opcional): Valor predeterminado: 60.start_time_iso/end_time_iso(cadena, opcional)
get_database_slow_queries
db_system(cadena, opcional): p. ej.postgresql,mysql,mongodb,redis.host(cadena, opcional): Host de la base de datos (net_peer_name).service_name(cadena, opcional): Nombre del servicio que realiza la llamada.env(cadena, opcional)min_duration_ms(flotante, opcional): Duración mínima de la consulta en ms.lookback_minutes(entero, opcional): Valor predeterminado: 60.start_time_iso/end_time_iso(cadena, opcional)limit(entero, opcional): Valor predeterminado: 20.
get_database_queries
db_system(cadena, opcional)host(cadena, opcional)service_name(cadena, opcional)env(cadena, opcional)lookback_minutes(entero, opcional): Valor predeterminado: 60.start_time_iso/end_time_iso(cadena, opcional)limit(entero, opcional): Valor predeterminado: 20.
get_database_server_metrics
db_system(cadena, obligatorio): p. ej.postgresql,mysql,mongodb,redis,aerospike.host(cadena, opcional)lookback_minutes(entero, opcional): Valor predeterminado: 60.start_time_iso/end_time_iso(cadena, opcional)
prometheus_range_query
query(cadena, obligatorio): La consulta PromQL.start_time_iso/end_time_iso(cadena, opcional): Valor predeterminado: últimos 60 min.lookback_minutes(flotante, opcional): Valor predeterminado: 60.
prometheus_instant_query
query(cadena, obligatorio)time_iso(cadena, opcional): Valor predeterminado: ahora.lookback_minutes(flotante, opcional)
prometheus_label_values
match_query(cadena, opcional): Filtro PromQL.label(cadena, obligatorio): Nombre de la etiqueta.start_time_iso/end_time_iso(cadena, opcional)
prometheus_labels
match_query(cadena, opcional): Filtro PromQL.start_time_iso/end_time_iso(cadena, opcional)
get_logs
logjson_query(arreglo, obligatorio): Consulta de pipeline en JSON.lookback_minutes(entero, opcional): Valor predeterminado: 5.start_time_iso/end_time_iso(cadena, opcional)limit(entero, opcional): Valor predeterminado del servidor: 5000.index(cadena, opcional):physical_index:<name>orehydration_index:<block_name>.
Para el inventario de servicios basado en logs, consulta primero physical_index_service_count:
sum by (name, service_name, env) (physical_index_service_count{destination="logs"})
Usa service_name como ServiceName, env como el entorno cuando esté presente y name como el nombre del índice físico. Si name="default", omite index; para un índice físico no predeterminado seleccionado por el usuario, pasa index: "physical_index:<name>". Si el backend rechaza el filtrado explícito por índice físico, reintenta sin index e informa que el filtrado explícito por índice físico no está disponible para ese backend.
get_service_logs
service(cadena, obligatorio)lookback_minutes(entero, opcional): Valor predeterminado: 60.limit(entero, opcional): Valor predeterminado: 20.env(cadena, opcional)severity_filters(arreglo, opcional): p. ej.["error", "warn"]. Lógica OR.body_filters(arreglo, opcional): p. ej.["timeout", "failed"]. Lógica OR.start_time_iso/end_time_iso(cadena, opcional)index(cadena, opcional)
Múltiples tipos de filtro se combinan con AND. Cada arreglo usa OR internamente.
Usa get_logs primero para recuentos agregados amplios; usa get_service_logs solo después de acotar a un servicio/entorno/índice y un conjunto de muestra pequeño.
get_log_attributes
lookback_minutes(entero, opcional): Valor predeterminado: 15.start_time_iso/end_time_iso(cadena, opcional)region(cadena, opcional)index(cadena, opcional)
get_log_attributes_for_pipeline
pipeline(arreglo, obligatorio): Etapas de filtro previas para acotar el descubrimiento, p. ej.[{"type":"filter","query":{"$eq":["ServiceName","<service>"]}}].lookback_minutes(entero, opcional): Valor predeterminado: 15.start_time_iso/end_time_iso(cadena, opcional)region(cadena, opcional)index(cadena, opcional)
get_drop_rules
Sin parámetros.
add_drop_rule
name(cadena, obligatorio)filters(arreglo, obligatorio): Cada filtro:key,value,operator(equals/not_equals),conjunction(and).
get_traces
Úsalo para búsquedas amplias y agregaciones. Para búsqueda exacta por ID de traza, usa get_service_traces.
tracejson_query(arreglo, obligatorio)start_time_iso/end_time_iso(cadena, opcional)lookback_minutes(entero, opcional): Valor predeterminado: 60.limit(entero, opcional): Valor predeterminado: 5000.
get_service_traces
Se requiere exactamente uno de trace_id o service_name.
trace_id(cadena, opcional): Ventana de búsqueda predeterminada: 72 horas.service_name(cadena, opcional): Ventana de búsqueda predeterminada: 60 min.lookback_minutes(entero, opcional)start_time_iso/end_time_iso(cadena, opcional)limit(entero, opcional): Valor predeterminado: 10.env(cadena, opcional)
get_trace_attributes
lookback_minutes(entero, opcional): Valor predeterminado: 15.start_time_iso/end_time_iso(cadena, opcional)region(cadena, opcional)
get_trace_attributes_for_pipeline
pipeline(arreglo, obligatorio): Etapas de filtro previas para acotar el descubrimiento, p. ej.[{"type":"filter","query":{"$eq":["ServiceName","<service>"]}}].lookback_minutes(entero, opcional): Valor predeterminado: 15.start_time_iso/end_time_iso(cadena, opcional)region(cadena, opcional)
get_trace_attribute_values
tag_name(cadena, obligatorio): Nombre del atributo deget_trace_attributes(p. ej.resource_departmentoattributes['http.method']).pipeline(arreglo, opcional): Etapas de filtro previas para acotar los valores; omítelo para valores globales.region(cadena, opcional)
get_change_events
start_time_iso/end_time_iso(cadena, opcional)lookback_minutes(entero, opcional): Valor predeterminado: 60.service(cadena, opcional)environment(cadena, opcional)event_name(cadena, opcional): Llama sin esto primero para obteneravailable_event_names.
get_alert_config
search_term(cadena, opcional): Búsqueda de texto libre en nombre, grupo, fuente de datos, etiquetas.rule_name(cadena, opcional)severity(cadena, opcional)rule_type(cadena, opcional):staticoanomaly.alert_group_name/alert_group_type/data_source_name(cadena, opcional)tags(arreglo, opcional): Todas deben coincidir (lógica AND).
get_alerts
time_iso(cadena, opcional): Hora de evaluación en RFC3339.window(entero, opcional): Ventana de búsqueda en segundos. Valor predeterminado: 900. Rango: 60–86400.lookback_minutes(entero, opcional): Rango: 1–1440.
get_alert_rule_state
start_time(entero, obligatorio): Inicio del rango en epoch Unix (inclusivo).end_time(entero, obligatorio): Fin del rango en epoch Unix (inclusivo).step(entero, obligatorio): Resolución en segundos entre muestras. El número de muestras((end_time - start_time) / step + 1)está limitado a 100.alert_group_id(cadena, opcional): Filtrar por ID de grupo de alertas.rule_name(cadena, opcional): Filtro regex sobre el nombre de la regla.alert_group_name(cadena, opcional): Filtro regex sobre el nombre del grupo de alertas.label_filters(cadena, opcional): Filtros de etiquetaskey=valueseparados por comas.state(cadena, opcional): Filtrar por estado (p. ej.firing).
Devuelve un mapa JSON de rule_id -> [{timestamp, is_firing}]. Una marca de tiempo en la que una regla está ausente de la respuesta del upstream se reporta como is_firing=0 — esto significa "no se observó en estado de disparo", no un estado normal confirmado.
get_notification_channels
Sin parámetros. Devuelve todos los canales de notificación configurados (Slack, PagerDuty, correo electrónico, webhooks, etc.).
did_you_mean
query(cadena, obligatorio): El nombre a buscar — parcial, mal escrito o abreviado.type(cadena, opcional): Restringir al tipo de entidad:service,environment,host,database,k8s_deployment,k8s_namespace,job.
Devuelve hasta 3 coincidencias más cercanas con puntuaciones de similitud. Úsalo antes de cualquier llamada a herramienta donde el nombre de la entidad sea incierto. Si una llamada anterior devolvió resultados vacíos, prueba esto antes de reintentar.
list_dashboards
Sin parámetros. Devuelve todos los dashboards personalizados en la organización como un arreglo JSON con id, name y metadatos.
get_dashboard
id(cadena, obligatorio): UUID del dashboard.region(cadena, opcional): Región para la población de consultas del panel. Valor predeterminado: región de la fuente de datos configurada.
create_dashboard
dashboard(objeto, obligatorio): Definición del dashboard connameypanels[]. Cada panel requierename,version,layout(x,y,w,h),visualization.typeyqueries[].metadata(objeto, opcional): Metadatos del dashboard — campos_categoryy_type(p. ej.{"_category":"custom","_type":"metrics"}).
update_dashboard
id(cadena, obligatorio): UUID del dashboard a actualizar.dashboard(objeto, obligatorio): Cuerpo completo de reemplazo del dashboard (misma estructura que en la creación).metadata(objeto, opcional): Metadatos de reemplazo. Los dashboards de sistema de solo lectura devuelven un error 403.
delete_dashboard
id(cadena, obligatorio): UUID del dashboard a eliminar. Los dashboards de sistema de solo lectura no se pueden eliminar.
Pruebas
Consulta TESTING.md para la configuración e instrucciones de pruebas de integración.
