Harness

oficial

Accede e interactúa con los datos de la plataforma Harness, incluyendo pipelines, repositorios, logs y registros de artefactos.

¿Qué puedes hacer con Harness MCP?

  • Listar e inspeccionar recursos — Pídele a tu asistente que descubra organizaciones, proyectos, pipelines o feature flags usando harness_list y harness_get en 243 tipos de recursos.
  • Monitoreo de ejecuciones entre proyectos — Haz que el agente encuentre ejecuciones de pipelines fallidas en todos los proyectos navegando dinámicamente por la jerarquía de la cuenta con harness_list.
  • Crear y actualizar recursos — Usa harness_create y harness_update para aprovisionar o modificar servicios, entornos u otras entidades de Harness a partir de lenguaje natural.
  • Ejecutar flujos de trabajo de la plataforma — Aprovecha 35 plantillas de prompt integradas para depurar pipelines fallidos, revisar métricas de DORA, clasificar vulnerabilidades o planificar despliegues de feature flags.
  • Soporte de sesiones multiusuario — En despliegues compartidos, cada sesión puede autenticarse con su propio encabezado x-harness-api-key, manteniendo el registro de auditoría vinculado al usuario real.

Documentación

Servidor MCP de Harness 2.0

MCP Toplist

Un servidor MCP (Model Context Protocol) que brinda a los agentes de IA acceso completo a la plataforma Harness.io a través de 11 herramientas consolidadas y 243 tipos de recursos.

Por qué usar este servidor MCP

La mayoría de los servidores MCP asignan una herramienta por endpoint de API. Para una plataforma tan amplia como Harness, eso significa más de 240 herramientas, y los LLM empeoran en la selección de herramientas a medida que aumenta la cantidad. Las ventanas de contexto se llenan con esquemas, y cada nuevo endpoint implica nuevo código.

Este servidor está construido de manera diferente:

  • 11 herramientas, 243 tipos de recursos. Un sistema de despacho basado en registro enruta harness_list, harness_get, harness_create, etc. a cualquier recurso de Harness: pipelines, servicios, entornos, organizaciones, proyectos, feature flags, datos de costos y más. El LLM elige entre 11 herramientas en lugar de cientos.
  • Cobertura completa de la plataforma. 40 conjuntos de herramientas predeterminados que abarcan CI/CD, GitOps, Feature Flags, Gestión de Costos en la Nube, Pruebas de Seguridad, Ingeniería del Caos, DevOps de Bases de Datos, Portal Interno para Desarrolladores, Cadena de Suministro de Software, Gestión de Infraestructura como Código, Gestión de Lanzamientos, Gobernanza, Anulaciones de Servicios, Grafo de Conocimiento y más. La cobertura opcional de Ansible está disponible cuando necesitas datos de inventario y playbooks.
  • Flujos de trabajo multi-proyecto listos para usar. Los agentes descubren organizaciones y proyectos dinámicamente, sin necesidad de variables de entorno codificadas. Pregunta "muestra ejecuciones fallidas en todos los proyectos" y el agente puede navegar por toda la jerarquía de la cuenta.
  • 35 plantillas de prompts. Prompts preconstruidos para flujos de trabajo comunes: construir e implementar aplicaciones de extremo a extremo, depurar pipelines fallidos, revisar métricas DORA, clasificar vulnerabilidades, optimizar costos en la nube, auditar control de acceso, planificar despliegues de feature flags, revisar pull requests, aprobar pipelines pendientes y más.
  • Funciona en todas partes. Transporte Stdio para clientes locales (Claude Desktop, Cursor, Devin Desktop), transporte HTTP para despliegues remotos/compartidos, listo para Docker y Kubernetes.
  • Inicio sin configuración. Solo proporciona una clave de API de Harness. El ID de cuenta se extrae automáticamente de los tokens PAT y SAT, los valores predeterminados de org/proyecto son opcionales, y el filtrado de conjuntos de herramientas te permite exponer solo lo que necesitas.
  • Extensible por diseño. Agregar un nuevo recurso de Harness significa agregar un archivo de datos declarativo: sin registro de nuevas herramientas, sin cambios de esquema, sin actualizaciones de prompts.

Requisitos previos

Antes de instalar o ejecutar el servidor, necesitas una clave de API de Harness:

  1. Inicia sesión en tu cuenta de Harness
  2. Ve a Mi PerfilClaves de API+ Nueva Clave de API
  3. Crea un nuevo Token bajo la clave de API; esto genera un PAT o SAT en el formato <prefix>.<accountId>.<tokenId>.<secret>
  4. Guarda el token en un lugar seguro; lo necesitarás en el siguiente paso

Para instrucciones detalladas, consulta la Guía de inicio rápido de la API de Harness.

Inicio rápido

Opción 0: Harness MCP alojado

Si tu cuenta de Harness tiene habilitado el servicio MCP alojado, los clientes que admiten servidores MCP remotos pueden conectarse directamente al endpoint administrado en lugar de ejecutar el servidor localmente.

Importante: El servicio MCP alojado utiliza OAuth de la Plataforma Harness, no HARNESS_API_KEY. También debe estar habilitado/configurado por cuenta por Soporte de Harness antes de que el endpoint pueda usarse.

Consulta Harness MCP alojado para ver ejemplos de configuración.

Opción 1: npx (Recomendado)

No requiere instalación, solo ejecútalo:

HARNESS_API_KEY=pat.xxx.xxx.xxx npx harness-mcp-v2@latest

O configura la clave de API en tu cliente de IA (consulta Configuración del cliente a continuación).

# Stdio transport (default — for Claude Desktop, Cursor, Devin Desktop, etc.)
HARNESS_API_KEY=pat.xxx npx harness-mcp-v2

# HTTP transport (for remote/shared deployments)
HARNESS_API_KEY=pat.xxx npx harness-mcp-v2 http --port 8080

Nota: El ID de cuenta se extrae automáticamente de los tokens PAT y SAT (pat.<accountId>... o sat.<accountId>...), por lo que HARNESS_ACCOUNT_ID solo se necesita para claves de API sin un segmento de cuenta integrado.

Opción 2: Instalación global

npm install -g harness-mcp-v2

# Then run directly
harness-mcp-v2

Opción 3: Compilar desde el código fuente

Para desarrollo o personalización:

git clone https://github.com/harness/mcp-server.git
cd mcp-server
pnpm install
pnpm build

# Run
pnpm start              # Stdio transport
pnpm start:http         # HTTP transport
pnpm inspect            # Test with MCP Inspector

Paquete del directorio MCP de Anthropic

El manifiesto del paquete MCPB se encuentra en [mcp-directory/](mcp-directory/), y el ícono del paquete de 512×512 se rastrea en [icon.png](icon.png) en la raíz del repositorio. El archivo empaquetado contiene manifest.json, icon.png, server/, package.json, npm-shrinkwrap.json a nivel raíz, y node_modules/ de producción.

Para mantener el archivo pequeño, compila los paquetes MCPB desde un directorio de preparación:

pnpm prepare:mcpb

El directorio de preparación se escribe en dist/mcpb/ con las dependencias de producción instaladas desde npm-shrinkwrap.json usando el diseño plano de npm. El CLI oficial fijado de MCPB lo valida y crea dist/harness-mcp-server-<version>.mcpb.

Las etiquetas de versión que coinciden con v*.*.* publican ese paquete en la Release correspondiente de GitHub automáticamente. Para rellenar una release existente sin volver a publicar npm, ejecuta el flujo de trabajo Release manualmente con su entrada release_tag (por ejemplo, v3.2.20). El flujo de trabajo verifica y compila esa etiqueta exacta antes de reemplazar solo su activo MCPB versionado.

Uso del CLI

harness-mcp-v2 [stdio|http] [--port <number>]

Options:
  --port <number>  Port for HTTP transport (default: 3000, or PORT env var)
  --help           Show help message and exit
  --version        Print version and exit

El transporte predeterminado es stdio si no se especifica. Usa http para despliegues remotos/compartidos.

Transporte HTTP

Cuando se ejecuta en modo HTTP, el servidor expone:

EndpointMétodoDescripción
/mcpPOSTEndpoint JSON-RPC de MCP (solicitudes de initialize + sesión)
/mcpGETFlujo SSE para mensajes iniciados por el servidor (progreso, elicitación)
/mcpDELETETermina una sesión MCP activa
/mcpOPTIONSPreflight CORS
/healthGETVerificación de salud: devuelve { "status": "ok", "sessions": <count> }

El transporte HTTP se ejecuta en modo basado en sesiones. Se crea una nueva sesión MCP en initialize, el servidor devuelve un encabezado mcp-session-id, y las solicitudes posteriores para esa sesión deben incluir el mismo encabezado.

Restricciones operativas en modo HTTP:

  • Establece HARNESS_MCP_AUTH_TOKEN para cualquier despliegue compartido o accesible de forma remota. Cuando se establece, cada solicitud POST, GET y DELETE a /mcp debe incluir Authorization: Bearer <token>.
  • Los enlaces que no son de loopback requieren HARNESS_MCP_AUTH_TOKEN de forma predeterminada. Para ejecutar sin autenticación en una interfaz que no sea de loopback de todos modos, establece HARNESS_MCP_ALLOW_UNAUTHENTICATED_HTTP=true explícitamente.
  • POST /mcp sin mcp-session-id debe ser una solicitud initialize.
  • POST /mcp, GET /mcp y DELETE /mcp para sesiones existentes requieren el encabezado mcp-session-id.
  • GET /mcp se usa para notificaciones SSE (actualizaciones de progreso y prompts de elicitación).
  • Las sesiones inactivas se eliminan después de MCP_SESSION_TTL_MS milisegundos una vez que no hay solicitudes ni flujos SSE activos (predeterminado 1800000, o 30 minutos).
  • GET /health es el único endpoint que no es de MCP.
  • El tamaño del cuerpo de la solicitud está limitado por HARNESS_MAX_BODY_SIZE_MB (predeterminado 10 MB).
  • Establece x-harness-pipeline-version: 0 o 1 en la solicitud initialize para seleccionar recursos de pipeline V0 o V1 para esa sesión HTTP.
  • Establece x-harness-auto-approve-risk: none|low_write|medium_write|high_write|all en la solicitud initialize para elegir un umbral de aprobación automática por sesión más estricto. El servidor limita este valor al HARNESS_AUTO_APPROVE_RISK a nivel de despliegue, por lo que una sesión puede reducir pero no ampliar el techo de aprobación configurado.

Modo multiusuario

Establece HARNESS_MCP_MODE=multi-user para despliegues HTTP compartidos donde cada cliente se autentica como un usuario diferente de Harness. En este modo:

  • HARNESS_API_KEY no debe establecerse en la configuración del servidor: el servidor no contiene credenciales de Harness.
  • Cada sesión debe proporcionar x-harness-api-key en la solicitud initialize. x-harness-account-id solo se requiere cuando la clave de API no incorpora un segmento de cuenta.
  • Las sesiones también pueden proporcionar los encabezados x-harness-org y x-harness-project para establecer el alcance predeterminado de esa sesión.
  • La clave de API de Harness fluye a través de cada llamada a la API de Harness para esa sesión, por lo que el registro de auditoría en Harness refleja al usuario real.
  • HARNESS_MCP_AUTH_TOKEN es independiente y aún puede usarse como una puerta adicional a nivel de transporte.
# Health check
curl http://localhost:3000/health

# MCP initialize request (capture mcp-session-id response header)
# In multi-user mode, x-harness-api-key is required on initialize.
# x-harness-account-id is needed only for API keys without an embedded account segment.
curl -i -X POST http://localhost:3000/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "Authorization: Bearer $HARNESS_MCP_AUTH_TOKEN" \
  -H "x-harness-api-key: $HARNESS_API_KEY" \
  -H "x-harness-account-id: $HARNESS_ACCOUNT_ID" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}'

# Subsequent MCP request (use returned session ID)
curl -X POST http://localhost:3000/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "Authorization: Bearer $HARNESS_MCP_AUTH_TOKEN" \
  -H "mcp-session-id: <session-id>" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}'

# Terminate session
curl -X DELETE http://localhost:3000/mcp \
  -H "Authorization: Bearer $HARNESS_MCP_AUTH_TOKEN" \
  -H "mcp-session-id: <session-id>"

HARNESS_MCP_ALLOWED_HOSTS controla la validación del encabezado Host para la protección contra el rebinding de DNS, y CORS limita los orígenes del navegador. Ninguno es autenticación; usa HARNESS_MCP_AUTH_TOKEN o una puerta de enlace/proxy inverso autenticado para el control de acceso.

Configuración del cliente

Nota: HARNESS_ORG y HARNESS_PROJECT son opcionales. Establecen el ID de org y el ID de proyecto que se usan cuando no se especifican por llamada de herramienta. Los agentes pueden descubrir organizaciones y proyectos dinámicamente usando harness_list(resource_type="organization") y harness_list(resource_type="project"). Los nombres obsoletos HARNESS_DEFAULT_ORG_ID y HARNESS_DEFAULT_PROJECT_ID aún se aceptan por compatibilidad con versiones anteriores.

Harness MCP alojado

Harness también admite un endpoint MCP alojado para cuentas que tienen habilitado el servicio administrado. Esto es útil cuando quieres un endpoint MCP remoto compartido en lugar de ejecutar npx harness-mcp-v2 o autoalojar el transporte HTTP tú mismo.

Importante: La autenticación de MCP alojado utiliza OAuth de la Plataforma Harness. No usa HARNESS_API_KEY en la configuración del cliente. La disponibilidad de MCP alojado se configura por cuenta de Harness, por lo que deberás trabajar con Soporte de Harness para habilitar/configurar el ajuste antes de usarlo.

El endpoint alojado https://mcp.harness.io/mcp es un servicio administrado. La configuración MCP del lado del cliente en Claude, Cursor o Cowork no puede anular a qué entorno de Harness se enruta. Para Harness0 u otro entorno SaaS privado de Harness, solicita a Soporte de Harness que habilite/configure MCP alojado para ese entorno, o ejecuta el servidor local/autoalojado y establece HARNESS_BASE_URL al host de Harness de destino.

Ejemplo de MCP alojado:

{
  "mcpServers": {
    "harness-prod1-mcp": {
      "url": "https://mcp.harness.io/mcp",
      "auth": {
        "CLIENT_ID": "mcp-client"
      }
    }
  }
}

Ejemplo con entradas alojadas y locales:

{
  "mcpServers": {
    "harness-hosted": {
      "url": "https://mcp.harness.io/mcp",
      "auth": {
        "CLIENT_ID": "mcp-client"
      }
    },
    "harness-local": {
      "command": "/absolute/path/to/npx",
      "args": ["-y", "harness-mcp-v2@latest"],
      "env": {
        "HARNESS_API_KEY": "pat.xxx.xxx.xxx",
        "PATH": "/directory/containing/node:/usr/local/bin:/usr/bin:/bin"
      }
    }
  }
}

Solución de problemas de npx ENOENT o node: No such file or directory

Esto es un fallo de lanzamiento del proceso del cliente, no un fallo de autenticación de Harness. El servidor MCP aún no se ha iniciado, por lo que cambiar HARNESS_API_KEY no afectará a spawn npx ENOENT.

Las aplicaciones GUI (Cursor, Claude Desktop, Devin Desktop, VS Code) no siempre heredan el PATH de tu shell, por lo que pueden fallar al encontrar npx o node después de una recarga de configuración. Soluciona esto usando rutas absolutas y estableciendo explícitamente PATH en el bloque env:

{
  "mcpServers": {
    "harness": {
      "command": "/absolute/path/to/npx",
      "args": ["-y", "harness-mcp-v2"],
      "env": {
        "HARNESS_API_KEY": "pat.xxx.xxx.xxx",
        "PATH": "/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin"
      }
    }
  }
}

Encuentra tus rutas con which npx y which node en una terminal, luego asegúrate de que el directorio que contiene node esté incluido en el valor de PATH anterior. Ubicaciones comunes:

  • Homebrew (macOS): /opt/homebrew/bin/npx
  • nvm: ~/.nvm/versions/node/v20.x.x/bin/npx (ejecuta nvm which current para encontrar la ruta exacta)
  • Node del sistema: /usr/local/bin/npx

Claude Desktop (claude_desktop_config.json)

npx (sin instalación)

{
  "mcpServers": {
    "harness": {
      "command": "/absolute/path/to/npx",
      "args": ["-y", "harness-mcp-v2@latest"],
      "env": {
        "HARNESS_API_KEY": "pat.xxx.xxx.xxx",
        "PATH": "/directory/containing/node:/usr/local/bin:/usr/bin:/bin"
      }
    }
  }
}

node (instalación local)

npm install -g harness-mcp-v2
{
  "mcpServers": {
    "harness": {
      "command": "/absolute/path/to/harness-mcp-v2",
      "env": {
        "HARNESS_API_KEY": "pat.xxx.xxx.xxx",
        "PATH": "/directory/containing/node:/usr/local/bin:/usr/bin:/bin"
      }
    }
  }
}

Claude Code (vía claude mcp add)

npx (sin instalación)

claude mcp add harness -- npx harness-mcp-v2

node (instalación local)

npm install -g harness-mcp-v2
claude mcp add harness -- harness-mcp-v2

Luego establece HARNESS_API_KEY en tu entorno o archivo .env.

Cursor (.cursor/mcp.json)

npx (sin instalación, recomendado para configuraciones locales de Cursor)

{
  "mcpServers": {
    "harness": {
      "command": "/absolute/path/to/npx",
      "args": ["-y", "harness-mcp-v2@latest"],
      "env": {
        "HARNESS_API_KEY": "pat.xxx.xxx.xxx",
        "PATH": "/directory/containing/node:/usr/local/bin:/usr/bin:/bin"
      }
    }
  }
}

Ejecuta which npx en una terminal y usa esa ruta completa para command; incluye el directorio de which node al frente de PATH.

node (instalación local)

npm install -g harness-mcp-v2
{
  "mcpServers": {
    "harness": {
      "command": "/absolute/path/to/harness-mcp-v2",
      "env": {
        "HARNESS_API_KEY": "pat.xxx.xxx.xxx",
        "PATH": "/directory/containing/node:/usr/local/bin:/usr/bin:/bin"
      }
    }
  }
}

Ejecuta which harness-mcp-v2 después de npm install -g harness-mcp-v2 y usa esa ruta completa para command; incluye el directorio de which node al frente de PATH.

Devin Desktop (~/.windsurf/mcp.json)

npx (sin instalación)

{
  "mcpServers": {
    "harness": {
      "command": "/absolute/path/to/npx",
      "args": ["-y", "harness-mcp-v2@latest"],
      "env": {
        "HARNESS_API_KEY": "pat.xxx.xxx.xxx",
        "PATH": "/directory/containing/node:/usr/local/bin:/usr/bin:/bin"
      }
    }
  }
}

node (instalación local)

npm install -g harness-mcp-v2
{
  "mcpServers": {
    "harness": {
      "command": "/absolute/path/to/harness-mcp-v2",
      "env": {
        "HARNESS_API_KEY": "pat.xxx.xxx.xxx",
        "PATH": "/directory/containing/node:/usr/local/bin:/usr/bin:/bin"
      }
    }
  }
}

¿Usas una compilación local desde el código fuente?

Reemplaza el comando con la ruta a tu index.js compilado:

{
  "command": "node",
  "args": ["/absolute/path/to/harness-mcp-v2/build/index.js", "stdio"]
}

MCP Gateway

El servidor MCP de Harness es totalmente compatible con MCP Gateways — proxies inversos que proporcionan autenticación centralizada, gobernanza, enrutamiento de herramientas y observabilidad en múltiples servidores MCP. Dado que el servidor implementa el protocolo MCP estándar con transportes stdio y HTTP, funciona detrás de cualquier gateway compatible con MCP sin cambios de código.

¿Por qué usar un gateway?

  • Gestión centralizada de credenciales — sin claves API en configuraciones de agentes
  • Gobernanza y registro de auditoría para todas las llamadas de herramientas entre equipos
  • Un único endpoint para agentes en lugar de N conexiones a N servidores MCP
  • Control de acceso — restringe qué equipos pueden usar qué herramientas

Docker MCP Gateway

Registra el servidor en tu configuración de Docker MCP Gateway:

{
  "mcpServers": {
    "harness": {
      "command": "npx",
      "args": ["harness-mcp-v2"],
      "env": {
        "HARNESS_API_KEY": "pat.xxx.xxx.xxx"
      }
    }
  }
}

Portkey

Añade el servidor MCP de Harness a tu Portkey MCP Gateway para gobernanza empresarial, seguimiento de costos y enrutamiento multi-LLM:

{
  "mcpServers": {
    "harness": {
      "command": "npx",
      "args": ["harness-mcp-v2"],
      "env": {
        "HARNESS_API_KEY": "pat.xxx.xxx.xxx"
      }
    }
  }
}

LiteLLM

Añade a tu configuración de proxy LiteLLM:

mcp_servers:
  - name: harness
    command: npx
    args:
      - harness-mcp-v2
    env:
      HARNESS_API_KEY: "pat.xxx.xxx.xxx"

Envoy AI Gateway

El servidor funciona con el soporte MCP de Envoy AI Gateway mediante transporte HTTP:

# Start the server in HTTP mode
HARNESS_API_KEY=pat.xxx.xxx.xxx npx harness-mcp-v2 http --port 8080

Luego configura Envoy para enrutar a http://localhost:8080/mcp como backend MCP ascendente.

Kong

Usa el plugin AI MCP Proxy de Kong para exponer el servidor MCP de Harness a través de tu infraestructura de gateway Kong existente.

Otros Gateways

Cualquier gateway que soporte la especificación MCP (Microsoft MCP Gateway, IBM ContextForge, Cloudflare Workers, etc.) puede actuar como proxy de este servidor. Para gateways basados en stdio, usa el transporte predeterminado. Para gateways basados en HTTP, inicia el servidor con el transporte http y apunta el gateway al endpoint /mcp.

Docker

Compila y ejecuta el servidor como un contenedor Docker:

# Build the image
pnpm docker:build

# Run with your .env file
pnpm docker:run

# Or run directly with env vars
docker run --rm -p 3000:3000 \
  -e HARNESS_API_KEY=pat.xxx.xxx.xxx \
  -e HARNESS_ACCOUNT_ID=your-account-id \
  harness-mcp-server

El contenedor se ejecuta en modo HTTP en el puerto 3000 por defecto con una verificación de salud integrada.

Kubernetes

Despliega en un clúster de Kubernetes usando los manifiestos proporcionados:

# 1. Edit the Secret with your real credentials
#    k8s/secret.yaml — replace HARNESS_API_KEY and HARNESS_ACCOUNT_ID

# 2. Apply all manifests
kubectl apply -f k8s/

# 3. Verify the deployment
kubectl -n harness-mcp get pods

# 4. Port-forward for local testing
kubectl -n harness-mcp port-forward svc/harness-mcp-server 3000:80
curl http://localhost:3000/health

El despliegue ejecuta 2 réplicas con sondas de preparación/vitalidad, límites de recursos y contexto de seguridad sin root. El Service expone el puerto 80 internamente (apuntando al puerto 3000 del contenedor).

Configuración

El servidor carga automáticamente las variables de entorno desde un archivo .env en la raíz del proyecto si existe. Copia .env.example a .env y completa tus valores. Las variables de entorno también se pueden configurar mediante tu shell o la configuración del cliente MCP.

VariableRequeridoPredeterminadoDescripción
HARNESS_MCP_MODENosingle-userModo de despliegue: single-user (clave API en configuración, usada para todas las sesiones) o multi-user (solo HTTP, credenciales por sesión mediante cabeceras x-harness-api-key y opcional x-harness-account-id)
HARNESS_API_KEYSí*--Token de acceso personal de Harness o token de cuenta de servicio. Requerido en modo single-user. NO debe establecerse en modo multi-user
HARNESS_ACCOUNT_IDNo(de PAT/SAT)Identificador de cuenta de Harness. Se extrae automáticamente de tokens PAT/SAT en modo de usuario único; las sesiones multiusuario pueden proporcionar el suyo mediante x-harness-account-id cuando la clave API no incluye uno
HARNESS_BASE_URLNohttps://app.harness.ioURL base de API/UI de Harness para stdio local o despliegues HTTP autohospedados. Establézcala en entornos como https://harness0.harness.io cuando ejecute el servidor usted mismo. No afecta al endpoint hospedado gestionado https://mcp.harness.io/mcp
HARNESS_FME_API_KEYNo--Credencial opcional de usuario único/autohospedado FME/Split Admin usada para recursos fme_ solo en modo legado (workspace_id). Puede ser una clave admin de Split legada o un PAT/SAT de Harness con derecho FME. Las llamadas FME van directamente a api.split.io, por lo que las credenciales OAuth/de enrutamiento de servicio hospedadas para APIs de plataforma Harness no autentican estas solicitudes. No debe establecerse en modo multi-user; FME debe usar la credencial x-harness-api-key de cada sesión. Si no se establece, FME recurre a un HARNESS_API_KEY no marcador para sesiones autohospedadas. El modo nativo de Harness (org_id+project_id) ignora esto y usa el estándar HARNESS_API_KEY/HARNESS_BASE_URL en su lugar
HARNESS_FME_BASE_URLNohttps://api.split.ioURL base de API Admin Split/FME usada por recursos fme_ solo en modo legado (workspace_id). Las URLs HTTP requieren HARNESS_ALLOW_HTTP=true para desarrollo local. El modo nativo de Harness (org_id+project_id) ignora esto y usa el estándar HARNESS_API_KEY/HARNESS_BASE_URL en su lugar
HARNESS_ORGNo--ID de organización. Se usa cuando org_id no se especifica por llamada de herramienta. Si se omite, org_id debe proporcionarse explícitamente. Los agentes también pueden descubrir organizaciones dinámicamente mediante harness_list(resource_type="organization")
HARNESS_PROJECTNo--ID de proyecto. Se usa cuando project_id no se especifica por llamada de herramienta. Los agentes también pueden descubrir proyectos dinámicamente mediante harness_list(resource_type="project")
HARNESS_API_TIMEOUT_MSNo30000Tiempo de espera de solicitud HTTP en milisegundos
HARNESS_MAX_RETRIESNo3Número de reintentos para fallos transitorios (429, 5xx)
HARNESS_MAX_BODY_SIZE_MBNo10Tamaño máximo del cuerpo de solicitud HTTP en MB para transporte http
HARNESS_RATE_LIMIT_RPSNo10Limitación de solicitudes del lado del cliente (solicitudes por segundo) a las APIs de Harness
LOG_LEVELNoinfoVerbosidad de registro: debug, info, warn, error
HARNESS_TOOLSETSNo(predeterminados)Lista de conjuntos de herramientas separada por comas. Vacío carga los conjuntos predeterminados. Admite +name para incluir explícitamente conjuntos opt-in y -name para eliminar predeterminados (ver Filtrado de conjuntos de herramientas)
HARNESS_READ_ONLYNofalseBloquear todas las operaciones de mutación (crear, actualizar, eliminar, ejecutar). Solo se permiten listar y obtener. Útil para entornos compartidos/demo
HARNESS_AUTO_APPROVE_RISKNononeUmbral de aprobación automática basado en riesgo para flujos de trabajo autónomos. Las operaciones en o por debajo de este riesgo proceden sin confirmación. Valores: none, low_write, medium_write, high_write, all. Ver Elicitación
HARNESS_SKIP_ELICITATIONNofalseObsoleto — use HARNESS_AUTO_APPROVE_RISK=all en su lugar. Se mantiene para compatibilidad hacia atrás
HARNESS_ALLOW_HTTPNofalsePermitir HARNESS_BASE_URL no HTTPS. Por defecto, el servidor impone HTTPS por seguridad. Establezca a true solo para desarrollo local contra una instancia Harness sin TLS
HARNESS_PIPELINE_VERSIONNo0(Alfa) Versión de YAML de pipeline. 0 carga el tipo de recurso pipeline y excluye pipeline_v1; 1 carga pipeline_v1 y excluye pipeline. Las sesiones HTTP pueden anular esto en tiempo de inicialización con x-harness-pipeline-version: 0 o 1
HARNESS_MCP_ALLOWED_HOSTSNo--Nombres de host permitidos separados por comas por la validación de cabecera Host del transporte HTTP. mcp.harness.io se permite por defecto para enlaces localhost; agregue dominios proxy/personalizados aquí
HARNESS_MCP_AUTH_TOKENNo--Token Bearer requerido en rutas HTTP /mcp cuando se establece. Requerido por defecto cuando el transporte HTTP se vincula a un host no loopback
HARNESS_MCP_ALLOW_UNAUTHENTICATED_HTTPNofalsePermitir explícitamente transporte HTTP no autenticado en enlaces no loopback. Use solo detrás de otro control autenticado
HARNESS_MCP_TRUST_PROXYNo0Número de saltos de proxy inverso / balanceador de carga a confiar para resolución de IP de cliente (Express trust proxy). Establezca al número de proxies frente al servidor para que las claves de limitación por IP se basen en el cliente real en lugar del par de socket del proxy
HARNESS_MCP_LOG_FILENo~/.claude/harness-mcp.logArchivo usado para diagnósticos de desconexión/fallo de stdio cuando stderr puede ya no estar disponible
HARNESS_LOG_UNSAFE_BODIESNofalseIncluir cuerpos de solicitud/respuesta sin procesar en registros. Desactivado por defecto ya que los cuerpos pueden contener secretos; habilite solo para depuración local
HARNESS_AUDIT_FILENo--Anexar eventos de auditoría a un archivo JSON delimitado por nuevas líneas para recolección local duradera
HARNESS_AUDIT_WEBHOOK_URLNo--Endpoint HTTPS que recibe eventos de auditoría por lotes. Las URLs HTTP requieren HARNESS_ALLOW_HTTP=true para desarrollo local
HARNESS_AUDIT_WEBHOOK_TOKENNo--Token Bearer opcional enviado al webhook de auditoría
HARNESS_AUDIT_WEBHOOK_BATCH_SIZENo10Número de eventos de auditoría a agrupar antes del vaciado del webhook
HARNESS_AUDIT_WEBHOOK_FLUSH_MSNo5000Tiempo máximo para retener eventos de auditoría antes del vaciado del webhook
OTEL_EXPORTER_OTLP_ENDPOINTNo--Habilita tramos de auditoría OpenTelemetry cuando los paquetes opcionales de OpenTelemetry están instalados
HARNESS_SEARCH_PROVIDERNolocalBackend de búsqueda semántica: local (incrustaciones ONNX en proceso, predeterminado), remote (servicio de búsqueda externo vía HTTP, requerido para modo multiusuario), o none (deshabilitar búsqueda semántica, recurrir solo a dispersión-recolección por palabras clave). Use none en entornos aislados o cuando la carga del modelo al inicio no sea deseable
HARNESS_SEARCH_SERVICE_URLNo--URL base del servicio de búsqueda remoto cuando HARNESS_SEARCH_PROVIDER=remote (p. ej. http://search-svc:8080). Requerido al usar el proveedor remote
HARNESS_SEARCH_SERVICE_HEADERSNo--Objeto JSON de encabezados enviados con cada solicitud al servicio de búsqueda remota. Admite cualquier esquema de autenticación: {"Authorization":"Bearer tok"}, {"x-api-key":"key"}, o múltiples encabezados internos de servicio a servicio
HARNESS_HF_CACHE_DIRNo/tmp/hf-cacheDirectorio para la caché del modelo @huggingface/transformers utilizada por el proveedor de búsqueda local. La imagen Docker pre-carga el modelo en /app/.cache/hf para evitar descargas en tiempo de ejecución. Establézcalo en una ruta de volumen persistente en implementaciones de producción
HARNESS_DIAGNOSE_LOG_FETCH_CONCURRENCYNo3Descargas simultáneas máximas de blobs de registro emitidas por harness_diagnose al obtener registros de pasos fallidos. Aumente solo si la latencia de diagnóstico está dominada por el tiempo de pared de la descarga de registros y el pod tiene margen de memoria

Búsqueda Semántica

harness_search utiliza enrutamiento semántico para reducir las llamadas API de tipo scatter-gather antes de distribuirlas a Harness. Hay tres proveedores de búsqueda disponibles:

ProveedorCuándo usarlo
local (predeterminado)Modo stdio de un solo usuario. Ejecuta all-MiniLM-L6-v2 en proceso mediante @huggingface/transformers. Descarga un modelo de ~23 MB en el primer uso; los inicios posteriores usan la caché.
remoteModo HTTP multiusuario (alojado por Harness). Delega la incrustación y la recuperación a un servicio de búsqueda externo. El aislamiento de inquilinos se aplica mediante tenant_id — el conocimiento/documentación estática usa global, los datos de entidad por cuenta usan el ID de cuenta.
noneDesactiva la búsqueda semántica por completo; recurre a scatter-gather por palabras clave en todos los tipos de recursos.

Configuración del proveedor remoto:

HARNESS_SEARCH_PROVIDER=remote
HARNESS_SEARCH_SERVICE_URL=http://search-svc:8080

# Auth — any scheme via HARNESS_SEARCH_SERVICE_HEADERS (JSON object):
HARNESS_SEARCH_SERVICE_HEADERS='{"Authorization":"Bearer <token>"}'   # standard bearer
HARNESS_SEARCH_SERVICE_HEADERS='{"x-api-key":"<key>"}'               # API key header
HARNESS_SEARCH_SERVICE_HEADERS='{"x-harness-token":"<svc-token>"}'   # internal service-to-service
# Multiple headers (e.g. service mesh + tenant routing):
HARNESS_SEARCH_SERVICE_HEADERS='{"x-harness-token":"<tok>","x-tenant":"<id>"}'
# No auth (service mesh / mTLS handles it):
# omit HARNESS_SEARCH_SERVICE_HEADERS entirely

Prueba del proveedor remoto localmente con el servicio stub incluido (sin dependencias externas):

# 1. Create a venv and install FastAPI
python3 -m venv .venv-stub
.venv-stub/bin/pip install fastapi uvicorn

# 2. Start the stub (in-memory, cosine similarity, corpus + tenant filtering)
.venv-stub/bin/uvicorn stub-search-service:app --port 8082

# 3. Build the MCP server
pnpm build

# 4. Run the integration smoke test
node test-remote-provider.mjs
# Expected output:
#   available: true
#   indexed 2 docs
#   entity search results: pipeline:ts-test score=... corpus=entities
#   knowledge search results: schema:trigger score=...
#   all-corpus search results: (merged, sorted by score)
#   isolation check (other-acct, should be empty): PASS

# 5. Tear down
kill $(lsof -ti :8082)

El stub (stub-search-service.py) implementa el mismo contrato /v1/health, /v1/ingest y /v1/search que el servicio de búsqueda de producción. Utiliza una incrustación simple de bolsa de caracteres, por lo que no se requiere descarga de modelos — los resultados son semánticamente plausibles pero no de calidad de producción.

Aplicación de HTTPS

HARNESS_BASE_URL debe usar HTTPS de forma predeterminada. Si configuras una URL no HTTPS (p. ej., http://localhost:8080), el servidor se negará a iniciarse con:

HARNESS_BASE_URL must use HTTPS (got "http://..."). If you need HTTP for local development, set HARNESS_ALLOW_HTTP=true.

Registro de Auditoría

Todas las operaciones de API de Harness despachadas por el registro (list, get, create, update, delete y execute) emiten eventos de auditoría estructurados cuando los sumideros de auditoría están configurados. Los eventos de mutación incluyen la ruta de confirmación utilizada por la elicitación o la aprobación automática cuando hay un contexto de confirmación presente; los eventos de lectura actualmente omiten los metadatos de confirmación. Las herramientas locales de metadatos y descubrimiento de esquemas que omiten el registro, como harness_describe y harness_schema, no forman parte de este flujo de auditoría. Un sumidero de stderr está registrado de forma predeterminada, pero pasa por el registrador normal y obedece a LOG_LEVEL; configura sumideros de archivo o webhook para una recopilación de auditoría duradera:

  • HARNESS_AUDIT_FILE agrega eventos JSON delimitados por nueva línea para la recopilación local.
  • HARNESS_AUDIT_WEBHOOK_URL publica lotes { "events": [...] } en un webhook HTTPS, opcionalmente con HARNESS_AUDIT_WEBHOOK_TOKEN. Los lotes fallidos se vuelven a poner en cola con capacidad limitada y finalmente se descartan con una advertencia en lugar de bloquear la ejecución de la herramienta.
  • OTEL_EXPORTER_OTLP_ENDPOINT habilita los tramos de auditoría cuando las dependencias opcionales de OpenTelemetry están instaladas. El sumidero reutiliza un proveedor de trazadores existente cuando está registrado; de lo contrario, inicia un exportador OTLP independiente.

Cada evento incluye el nombre de la herramienta, el tipo de recurso, la operación, los identificadores, la marca de tiempo, el riesgo, el resultado, el método/ruta HTTP, la duración y el método de confirmación cuando corresponda. Los sumideros de auditoría son telemetría de mejor esfuerzo; los problemas de entrega se registran y nunca se reproducen ni cambian la operación subyacente de la API de Harness. Para detalles de configuración de OTel y atributos de tramos, consulta specs/005-otel-audit-sink.md.

Referencia de Herramientas

El servidor expone 11 herramientas MCP. La mayoría de las herramientas de API aceptan org_id y project_id como anulaciones opcionales — si se omiten, recurren a HARNESS_ORG y HARNESS_PROJECT. harness_describe es solo metadatos locales y no utiliza el alcance de org/proyecto.

Soporte de URL: La mayoría de las herramientas orientadas a API aceptan un parámetro url — pega una URL de la interfaz de Harness y el servidor extrae automáticamente org, proyecto, tipo de recurso, ID de recurso, ID de pipeline e ID de ejecución. harness_describe no acepta url.

Soporte de alcance: Los tipos de recursos con variantes de cuenta/org/proyecto exponen supportedScopes en harness_describe. Pasa resource_scope cuando necesites un nivel específico:

  • resource_scope: "account" envía solo accountIdentifier.
  • resource_scope: "org" envía accountIdentifier y orgIdentifier.
  • resource_scope: "project" envía identificadores de cuenta, org y proyecto.

Los recursos actuales de múltiples alcances incluyen connector, service, environment, infrastructure, secret, file_store, template, policy y policy_set. Si resource_scope se omite, el registro utiliza el alcance predeterminado del recurso y los valores predeterminados configurados, excepto que los recursos marcados como de alcance opcional pueden omitir org/proyecto a menos que se pasen explícitamente. Las URL de Harness también pueden establecer el alcance automáticamente cuando la ruta contiene contexto a nivel de cuenta o de proyecto.

Salida estructurada: Cada herramienta declara un outputSchema de MCP. harness_list normaliza las respuestas de Harness similares a listas en contenido estructurado con forma de objeto para que los clientes estrictos puedan validarlo: los arreglos de nivel superior se convierten en { "items": [...], "total": <count>, "page": <page> }, y las claves de envoltura comunes como content, data, body, objects o features se elevan a items cuando es necesario. La respuesta de texto aún contiene la carga útil JSON compacta devuelta a todos los clientes.

HerramientaDescripción
harness_describeDescubre los tipos de recursos, operaciones y campos disponibles. No realiza llamadas a la API — devuelve metadatos del registro local.
harness_schemaObtén definiciones exactas de esquemas YAML/JSON y ejemplos para crear/actualizar recursos. Los esquemas de pipelines/plantillas están incluidos; los esquemas de conectores, entornos, servicios, secretos e infraestructura son esquemas de entidad sensibles al ámbito, obtenidos de instantáneas incluidas o de NG /yaml-schema; los esquemas de release_process y release_activity se obtienen en vivo desde RMG /api/yamlSchema. Admite exploración en profundidad mediante path.
harness_listLista recursos de un tipo determinado con filtrado, búsqueda y paginación.
harness_getObtén un único recurso por su identificador.
harness_createCrea un nuevo recurso. Admite pipelines en línea y remotos (respaldados por Git). Solicita confirmación del usuario mediante elicitation.
harness_updateActualiza un recurso existente. Admite pipelines en línea y remotos (respaldados por Git). Solicita confirmación del usuario mediante elicitation.
harness_deleteElimina un recurso. Solicita confirmación del usuario mediante elicitation. Destructivo.
harness_executeEjecuta una acción sobre un recurso (ejecutar/reintentar pipeline, importar pipeline desde Git, alternar flag, sincronizar app). Solicita confirmación del usuario mediante elicitation. Para ejecuciones de pipelines, usa el flujo de trabajo de entradas en tiempo de ejecución a continuación (admite expansión abreviada de branch/tag/pr_number/commit_sha).
harness_searchBusca entre los tipos de recursos de Harness con una sola consulta. Utiliza enrutamiento semántico (embeddings ONNX locales de all-MiniLM-L6-v2, 384 dimensiones) para predecir los tipos de recursos relevantes a partir de un corpus de knowledge indexado al inicio — normalmente reduciendo de ~163 tipos a 1–8 antes del scatter-gather. Si la confianza semántica es baja, recurre a scatter-gather completo por palabras clave. La respuesta incluye semantic_routed y types_skipped cuando el enrutamiento se activa. Consulta docs/search-guidelines.md para saber cómo hacer que nuevos tipos de recursos sean detectables.
harness_diagnoseDiagnostica recursos de pipeline, connector, delegate y gitops_application (alias: execution -> pipeline, gitops_app -> gitops_application). Para pipelines, devuelve tiempos de etapas/pasos y detalles de fallos; para conectores/delegados/apps de GitOps, devuelve señales específicas de salud y resolución de problemas.
harness_statusObtén un panel de salud del proyecto en tiempo real — ejecuciones recientes, tasas de fallos y enlaces profundos.

Flujo de trabajo de consulta de esquemas

Usa harness_schema antes de crear o actualizar recursos respaldados por YAML para que los agentes puedan copiar nombres de campos y restricciones exactos en lugar de adivinar a partir de prosa.

  • Los esquemas incluidos incluyen pipeline, template, trigger, pipeline_v1, template_v1, inputSet_v1, overlayInputSet_v1 y agent-pipeline.
  • Los esquemas de entidad incluyen connector, environment, service, secret y infrastructure. Son sensibles al ámbito (account, org o project) y requieren org_id/project_id cuando el ámbito seleccionado lo requiere.
  • Las definiciones de Release Management (release_process, release_activity) obtienen JSON Schema en vivo desde RMG /api/yamlSchema (no incluidas). Pasa scope, org_id y project_id al delimitar a organización o proyecto.
  • Las instantáneas de entidades incluidas se usan primero cuando coinciden con la cuenta en tiempo de ejecución; de lo contrario, la herramienta recurre a la API de NG /yaml-schema de Harness y almacena en caché el resultado.
  • Omite path para un resumen de campos/secciones, luego pasa un path separado por puntos para inspeccionar una definición anidada.

Ejemplos:

{ "resource_type": "pipeline", "path": "pipeline.stages" }
{
  "resource_type": "connector",
  "scope": "project",
  "org_id": "default",
  "project_id": "payments"
}

Los mantenedores pueden actualizar las instantáneas de entidades incluidas con pnpm sync-entity-schemas cuando cambien los esquemas YAML de entidades de Harness.

Ejemplos de herramientas

Descubre qué recursos están disponibles:

{ "resource_type": "pipeline" }

Lista organizaciones en la cuenta:

{ "resource_type": "organization" }

Lista proyectos en una organización:

{ "resource_type": "project", "org_id": "default" }

Lista pipelines en un proyecto:

{ "resource_type": "pipeline", "search_term": "deploy", "size": 10 }

Obtén un servicio específico:

{ "resource_type": "service", "resource_id": "my-service-id" }

Ejecuta un pipeline:

{
  "resource_type": "pipeline",
  "action": "run",
  "resource_id": "my-pipeline",
  "inputs": { "tag": "v1.2.3" },
  "wait": true
}

Alterna un feature flag:

{
  "resource_type": "feature_flag",
  "action": "toggle",
  "resource_id": "new_checkout_flow",
  "enable": true,
  "environment": "production"
}

Busca en todos los tipos de recursos:

{ "query": "payment-service" }

Diagnostica una ejecución por ID (modo resumen — predeterminado):

{ "execution_id": "abc123XYZ" }

Diagnostica desde una URL de Harness:

{ "url": "https://app.harness.io/ng/account/.../pipelines/myPipeline/executions/abc123XYZ/pipeline" }

Diagnostica la conectividad de un conector:

{ "resource_type": "connector", "resource_id": "my_github_connector" }

Diagnostica la salud de un delegado:

{ "resource_type": "delegate", "resource_id": "delegate-us-east-1" }

Diagnostica una aplicación de GitOps (con opciones):

{
  "resource_type": "gitops_application",
  "resource_id": "checkout-app",
  "options": { "agent_id": "gitops-agent-1" }
}

Obtén el informe de ejecución más reciente de un pipeline:

{ "pipeline_id": "my-pipeline" }

Modo de diagnóstico completo con YAML y registros de pasos fallidos:

{ "execution_id": "abc123XYZ", "summary": false }

Modo resumen con registros habilitados (lo mejor de ambos):

{ "execution_id": "abc123XYZ", "include_logs": true }

Obtén el estado de salud del proyecto:

{ "org_id": "default", "project_id": "my-project", "limit": 5 }

Lista esquemas de base de datos filtrados por tipo de migración:

{ "resource_type": "database_schema", "migration_type": "Liquibase" }

Lista instancias de base de datos para un esquema:

{ "resource_type": "database_instance", "dbschema_id": "my_schema" }

Obtén el pipeline de autoría LLM resuelto para un esquema e instancia:

{ "resource_type": "database_llm_authoring_pipeline", "resource_id": "my_schema", "dbinstance_id": "prod_db" }

Lista nombres de objetos de instantánea (p. ej., tablas) para una instancia de esquema:

{
  "resource_type": "database_snapshot_object",
  "dbschema_id": "my_schema",
  "dbinstance_id": "prod_db",
  "object_type": "Table"
}

Obtén metadatos completos de instantánea para objetos nombrados específicos:

{
  "resource_type": "database_snapshot_object",
  "resource_id": "prod_db",
  "params": {
    "dbschema_id": "my_schema",
    "object_type": "Table",
    "object_names": ["users", "orders"]
  }
}

Flujo de trabajo de ejecución de pipelines (Recomendado)

Para pipelines v0, usa esta secuencia para reducir errores de entrada en tiempo de ejecución:

  1. Descubre entradas de tiempo de ejecución requeridas
  • harness_get(resource_type="runtime_input_template", resource_id="<pipeline_id>")
  • La plantilla devuelta muestra marcadores de posición de <+input> que necesitan valores.
  1. Elige la estrategia de entrada
  • Variables simples: pasa pares clave-valor planos de inputs (por ejemplo, {"branch":"main","env":"prod"}).

  • Entradas complejas/estructurales: usa input_set_ids (los bloques de codebase/build de CI y las entradas de plantilla anidadas se manejan mejor así).

  • Claves abreviadas de codebase de CI (solo ejecución de pipeline):

    Clave abreviadaEstructura expandida
    branchbuild.type=branch, build.spec.branch=<value>
    tagbuild.type=tag, build.spec.tag=<value>
    pr_numberbuild.type=PR, build.spec.number=<value>
    commit_shabuild.type=commitSha, build.spec.commitSha=<value>
  • Restricción: la expansión abreviada se omite cuando inputs.build ya está presente (el build explícito gana).

  1. Ejecuta la ejecución
  • harness_execute(resource_type="pipeline", action="run", resource_id="<pipeline_id>", ...)

  • Para pipelines respaldados por Git cuyo YAML deba cargarse desde una rama no predeterminada, pasa params.pipeline_branch (enviado a Harness como pipelineBranchName):

    {
      "resource_type": "pipeline",
      "action": "run",
      "resource_id": "deploy_app",
      "params": { "pipeline_branch": "feature/new-stage" },
      "inputs": { "branch": "main" },
      "wait": true
    }
    
  1. Opcional: combina ambos
  • Usa input_set_ids para la forma base y inputs para anulaciones simples.

Para pipelines v1:

  1. Obtén harness_get(resource_type="runtime_input_template_v1", resource_id="<pipeline_id>"). Para pipelines respaldados por Git, pasa branch_name, connector_ref y repo_name a través de params.
  2. Lee template_yaml y resolved_yaml para valores declarados de ${{ inputs.* }} y valores predeterminados.
  3. Ejecuta harness_execute(resource_type="pipeline_v1", action="run", resource_id="<pipeline_id>", inputs={...}). El servidor envuelve estos valores bajo una raíz YAML de inputs: y envía el cuerpo de inputs_yaml de la API.

Si los campos requeridos no están resueltos, la herramienta devuelve un error previo a la ejecución con las claves esperadas y conjuntos de entradas sugeridos. Puedes inspeccionar las asignaciones abreviadas disponibles con harness_describe(resource_type="pipeline") (executeActions.run.inputShorthands).

Ejecución dinámica de pipelines

Use pipeline_dynamic_execution.run cuando un agente o un sistema externo genera el YAML completo del pipeline v0 en tiempo de ejecución y necesita ejecutarlo contra un shell de pipeline de Harness existente. Esto no reemplaza el pipeline.run normal: el pipeline v0 guardado ya debe existir, la Ejecución dinámica permitida a nivel de cuenta y de pipeline debe estar habilitada, y el llamador necesita permisos de Edición y Ejecución en el pipeline.

{
  "resource_type": "pipeline_dynamic_execution",
  "action": "run",
  "resource_id": "deploy_app",
  "body": {
    "yaml": "pipeline:\n  identifier: deploy_app\n  name: Deploy App\n  stages: []"
  },
  "params": {
    "module_type": "CD",
    "notes": "agent-generated dynamic run",
    "notify_only_user": true
  }
}

Restricciones:

  • body debe ser un objeto con un campo yaml. Los cuerpos de cadena sin procesar son rechazados por el esquema público harness_execute.
  • body.yaml puede ser una cadena YAML o un objeto de pipeline JSON; el JSON se serializa a YAML antes de la solicitud.
  • Los marcadores de posición de <+input> en tiempo de ejecución no se resuelven mediante esta API. Envíe YAML completamente resuelto.
  • Los conjuntos de entrada, la ejecución selectiva de etapas, los reintentos y los disparadores no son compatibles con el endpoint de ejecución dinámica.
  • La acción es high_write y utiliza la ruta normal de confirmación/aprobación automática. La respuesta proyecta el sobre de la API a { "execution_id": "...", "status": "..." } e incluye un enlace de ejecución openInHarness cuando los datos de alcance están disponibles.

Si Harness rechaza la ejecución como no habilitada, verifique tanto la configuración de Ejecución dinámica permitida a nivel de cuenta como el interruptor a nivel de pipeline en Pipeline -> Opciones avanzadas -> Configuración de ejecución dinámica.

Análisis forense de entradas de ejecución

Use execution_inputs después de una ejecución para inspeccionar el YAML de entrada combinado que produjo una ejecución específica. Esto es útil cuando una falla depende de la combinación de conjuntos de entrada, ramas de conjuntos de entrada respaldadas por Git o valores de disparador/tiempo de ejecución que son difíciles de reconstruir solo desde la página de ejecución.

{
  "resource_type": "execution_inputs",
  "resource_id": "PLAN_EXECUTION_ID",
  "params": {
    "resolve_expressions": true,
    "resolve_expressions_type": "RESOLVE_ALL_EXPRESSIONS"
  }
}

La respuesta de obtención se proyecta a:

  • executionId: el ID de ejecución del plan de resource_id.
  • inputSetYaml: YAML de entrada de tiempo de ejecución combinado utilizado para la ejecución, o null.
  • inputSetTemplateYaml: plantilla de entrada en el momento de la ejecución, o null.
  • resolvedYaml: YAML resuelto por expresión cuando resolve_expressions=true, de lo contrario, generalmente null.
  • inputSetDetails: conjuntos de entrada guardados que contribuyen como pares { identifier, name }.
  • inputSetBranchName: rama de origen para conjuntos de entrada respaldados por Git, o null.

execution_inputs es solo de obtención y de riesgo de lectura. Si se omite resolve_expressions, el servidor omite los parámetros de consulta de la API y Harness usa su modo de resolución UNKNOWN predeterminado.

Modo de espera de ejecución de pipeline

Para pipeline.run, pipeline.retry y pipeline_v1.run, pase wait: true para permitir que el servidor sondee hasta que la ejecución alcance un estado terminal. Esto mantiene el lanzamiento del pipeline y la verificación de estado en una sola llamada de herramienta en lugar de pedirle al cliente o al LLM que ejecute un bucle de sondeo.

{
  "resource_type": "pipeline",
  "action": "run",
  "resource_id": "deploy_app",
  "inputs": { "branch": "main" },
  "wait": true,
  "wait_timeout_seconds": 900,
  "wait_poll_interval_seconds": 5
}

Comportamiento del modo de espera:

  • El tiempo de espera predeterminado es de 600 segundos; el rango permitido es de 10 segundos a 7200 segundos.
  • El intervalo de sondeo inicial es de 3 segundos por defecto, retrocede por 1.5x y tiene un tope de 30 segundos.
  • En caso de éxito o falla, la respuesta incluye campos como execution_id, execution_status, execution_terminal, execution_elapsed_ms y execution_poll_count.
  • Si el tiempo de espera se agota, el disparador original aún tuvo éxito; la respuesta incluye execution_timed_out: true y _wait.hint con el último estado observado.
  • Si el sondeo falla después de que el disparador tenga éxito, la respuesta incluye _wait.error y una sugerencia de revisión. No vuelva a ejecutar el pipeline a ciegas a menos que haya confirmado que la primera ejecución no está en curso.
  • Los estados terminales fallidos incluyen _diagnose_hint que apunta a harness_diagnose(resource_type="execution", options={execution_id: "..."}).

Pídale al Agente DevOps de IA que cree un pipeline:

{
  "prompt": "Create a pipeline that builds a Go app with Docker and deploys to Kubernetes",
  "action": "CREATE_PIPELINE"
}

Actualice un servicio mediante lenguaje natural:

{
  "prompt": "Add a sidecar container for logging",
  "action": "UPDATE_SERVICE",
  "conversation_id": "prev-conversation-id",
  "context": [{ "type": "yaml", "payload": "<existing service YAML>" }]
}

Modos de almacenamiento de pipelines

Los pipelines de Harness se pueden almacenar de tres maneras:

ModoDescripciónCuándo usar
En líneaYAML del pipeline almacenado en HarnessPredeterminado. Configuración más simple, no requiere Git.
Remoto (Git externo)YAML del pipeline almacenado en GitHub, GitLab, Bitbucket, etc.Equipos que usan pipeline-como-código respaldado por Git con un proveedor externo.
Remoto (Harness Code)YAML del pipeline almacenado en un repositorio de Harness CodeEquipos que usan el alojamiento Git integrado de Harness.

Cree un pipeline en línea (predeterminado):

// harness_create
{
  "resource_type": "pipeline",
  "body": {
    "yamlPipeline": "pipeline:\n  name: My Pipeline\n  identifier: my_pipeline\n  stages:\n    - stage:\n        name: Build\n        type: CI\n        spec:\n          execution:\n            steps:\n              - step:\n                  type: Run\n                  name: Echo\n                  spec:\n                    command: echo hello"
  }
}

Cree un pipeline remoto (Git externo, por ejemplo, GitHub):

// harness_create
{
  "resource_type": "pipeline",
  "body": {
    "yamlPipeline": "pipeline:\n  name: Deploy Service\n  identifier: deploy_service\n  stages: []"
  },
  "params": {
    "store_type": "REMOTE",
    "connector_ref": "my_github_connector",
    "repo_name": "my-repo",
    "branch": "main",
    "file_path": ".harness/deploy-service.yaml",
    "commit_msg": "Add deploy pipeline via MCP"
  }
}

Cree un pipeline remoto (Harness Code, sin necesidad de conector):

// harness_create
{
  "resource_type": "pipeline",
  "body": {
    "yamlPipeline": "pipeline:\n  name: Build App\n  identifier: build_app\n  stages: []"
  },
  "params": {
    "store_type": "REMOTE",
    "is_harness_code_repo": true,
    "repo_name": "product-management",
    "branch": "main",
    "file_path": ".harness/build-app.yaml",
    "commit_msg": "Add build pipeline via MCP"
  }
}

Actualice un pipeline remoto:

// harness_update
{
  "resource_type": "pipeline",
  "resource_id": "deploy_service",
  "body": {
    "yamlPipeline": "pipeline:\n  name: Deploy Service\n  identifier: deploy_service\n  stages:\n    - stage:\n        name: Deploy\n        type: Deployment"
  },
  "params": {
    "store_type": "REMOTE",
    "connector_ref": "my_github_connector",
    "repo_name": "my-repo",
    "branch": "main",
    "file_path": ".harness/deploy-service.yaml",
    "commit_msg": "Update deploy pipeline via MCP",
    "last_object_id": "abc123",
    "last_commit_id": "def456"
  }
}

Importe un pipeline desde un repositorio Git externo:

// harness_execute
{
  "resource_type": "pipeline",
  "action": "import",
  "params": {
    "connector_ref": "my_github_connector",
    "repo_name": "my-repo",
    "branch": "main",
    "file_path": ".harness/existing-pipeline.yaml"
  },
  "body": {
    "pipeline_name": "Existing Pipeline",
    "pipeline_description": "Imported from GitHub"
  }
}

Importe un pipeline desde un repositorio de Harness Code:

// harness_execute
{
  "resource_type": "pipeline",
  "action": "import",
  "params": {
    "is_harness_code_repo": true,
    "repo_name": "product-management",
    "branch": "main",
    "file_path": ".harness/existing-pipeline.yaml"
  },
  "body": {
    "pipeline_name": "Existing Pipeline"
  }
}

Cree un conector:

{
  "resource_type": "connector",
  "body": { "connector": { "name": "My Docker Hub", "identifier": "my_docker", "type": "DockerRegistry" } }
}

Elimine un disparador:

{
  "resource_type": "trigger",
  "resource_id": "nightly-trigger",
  "pipeline_id": "my-pipeline"
}

Liste los conjuntos de entrada para un pipeline:

{
  "resource_type": "input_set",
  "pipeline_id": "my-pipeline"
}

Obtenga un conjunto de entrada específico:

{
  "resource_type": "input_set",
  "resource_id": "prod-inputs",
  "pipeline_id": "my-pipeline"
}

Cree un conjunto de entrada:

{
  "resource_type": "input_set",
  "pipeline_id": "my-pipeline",
  "body": "inputSet:\n  name: Production Inputs\n  identifier: prod_inputs\n  pipeline:\n    identifier: my-pipeline\n    variables:\n      - name: env\n        type: String\n        value: production"
}

Actualice un conjunto de entrada:

{
  "resource_type": "input_set",
  "resource_id": "prod_inputs",
  "pipeline_id": "my-pipeline",
  "body": "inputSet:\n  name: Production Inputs\n  identifier: prod_inputs\n  pipeline:\n    identifier: my-pipeline\n    variables:\n      - name: env\n        type: String\n        value: production\n      - name: replicas\n        type: String\n        value: \"3\""
}

Elimine un conjunto de entrada:

{
  "resource_type": "input_set",
  "resource_id": "prod_inputs",
  "pipeline_id": "my-pipeline"
}

Tipos de recursos

243 tipos de recursos organizados en 40 conjuntos de herramientas. Cada tipo de recurso admite un subconjunto de operaciones CRUD y acciones de ejecución opcionales.

Plataforma

Tipo de recursoListaObtenerCrearActualizarEliminarAcciones de ejecución
organizationxxxxx
projectxxxxx

Pipelines

Tipo de recursoListaObtenerCrearActualizarEliminarAcciones de ejecución
pipelinexxxxxrun, retry
pipeline_v1 (Alfa)xxxxxrun
pipeline_dynamic_executionrun
executionxxinterrupt
execution_inputsx
triggerxxxxx
pipeline_summaryx
input_setxxxxx
runtime_input_templatex
runtime_input_template_v1x
pipeline_resolved_yamlx
approval_instancexapprove, reject

Ambos tipos de recursos YAML de pipeline están disponibles cuando el conjunto de herramientas de pipelines está habilitado. HARNESS_PIPELINE_VERSION y el encabezado de inicialización HTTP x-harness-pipeline-version seleccionan la preferencia de versión predeterminada; no ocultan la otra versión.

Agentes de IA

Tipo de recursoListaObtenerCrearActualizarEliminarAcciones de ejecución
agentxxxxx
agent_runx

Servicios

Tipo de recursoListaObtenerCrearActualizarEliminarAcciones de ejecución
servicexxxxx

Entornos

Tipo de recursoListaObtenerCrearActualizarEliminarAcciones de ejecución
environmentxxxxxmove_configs

Conectores

Tipo de recursoListaObtenerCrearActualizarEliminarAcciones de ejecución
connectorxxxxxtest_connection
connector_cataloguex

Infraestructura

Tipo de recursoListaObtenerCrearActualizarEliminarAcciones de ejecución
infrastructurexxxxxmove_configs

Secretos

Tipo de recursoListaObtenerCrearActualizarEliminarAcciones de ejecución
secretxx

Registros de ejecución

Tipo de recursoListaObtenerCrearActualizarEliminarAcciones de ejecución
execution_logx

Rastro de auditoría

Tipo de recursoListaObtenerCrearActualizarEliminarAcciones de ejecución
audit_eventxx

Delegados

Tipo de recursoListaObtenerCrearActualizarEliminarAcciones de ejecución
delegatex
delegate_tokenxxxxrevoke, get_delegates

Repositorios de código

Tipo de recursoListaObtenerCrearActualizarEliminarAcciones de ejecución
repositoryxxxx
branchxxxx
commitxxxdiff, diff_stats
file_contentxblame
tagxxx
repo_rulexx
space_rulexx

La creación de commit confirma una o más acciones de archivo directamente a través de la API de Harness Code sin clonar. Pase body.title, body.branch y body.actions; cada acción es CREATE, UPDATE, DELETE o MOVE, y UPDATE requiere el SHA de blob actual.

Registros de artefactos

Tipo de recursoListaObtenerCrearActualizarEliminarAcciones de ejecución
registryxx
artifactx
artifact_versionx
artifact_filex

Almacén de archivos

Tipo de recursoListaObtenerCrearActualizarEliminarAcciones de ejecución
file_storexxxxxlist_children
file_store gestiona archivos y carpetas de Harness File Store mediante las herramientas genéricas. Admite alcance de cuenta, organización y proyecto; pase `resource_scope="account""org""project"` o pegue una URL de Harness File Store para que el servidor pueda derivar el alcance y los IDs.

Llamadas comunes:

# List the account-level File Store.
harness_list(resource_type="file_store", resource_scope="account")

# Create a folder at the current scope root.
harness_create(resource_type="file_store", body={
  name: "scripts",
  type: "FOLDER",
  parent_identifier: "Root"
})

# Upload a UTF-8 script file. Use content_base64 instead for binary data.
harness_create(resource_type="file_store", body={
  name: "deploy.sh",
  type: "FILE",
  parent_identifier: "Root",
  content: "#!/usr/bin/env bash\n./deploy",
  mime_type: "text/x-shellscript",
  file_usage: "SCRIPT"
})

# Rename metadata without replacing file content.
harness_update(resource_type="file_store", resource_id="deploy_script", body={
  name: "deploy-prod.sh",
  type: "FILE",
  parent_identifier: "Root"
})

# List first-level children of a folder. This is a read-risk execute action.
harness_execute(resource_type="file_store", action="list_children",
  resource_id="scripts_folder", params={folder_name: "scripts"})

Restricciones del cuerpo multiparte:

  • Crear/actualizar acepta JSON body, luego conviértalo a multipart/form-data para /ng/api/file-store.
  • name, type (FILE o FOLDER) y parent_identifier son obligatorios; use el literal "Root" solo para la raíz del alcance seleccionado.
  • La creación de FILE requiere exactamente uno de content (cadena UTF-8) o content_base64 (base64 válido no vacío). La actualización de FILE puede omitir contenido para actualizaciones solo de metadatos, o proporcionar exactamente un campo de contenido para reemplazar el contenido.
  • La creación/actualización de FOLDER debe omitir content y content_base64.
  • El file_usage opcional debe ser MANIFEST_FILE, CONFIG o SCRIPT; los metadatos escalares opcionales como description, mime_type, path y tags deben ser cadenas.
  • El contenido de carga está limitado a 100 MB. Los avisos de confirmación redactan las vistas previas de content, content_base64 y contentBase64 antes de la elicitación.

list_children acepta tanto notación abreviada (resource_id más params.folder_name, o params.file_store_id/params.folder_identifier más params.folder_name) como un FileStoreNode body completo con identifier, name y type: "FOLDER". Los cuerpos completos usan parentIdentifier en camelCase de Harness; la notación abreviada puede usar params.parent_identifier.

Plantillas

Tipo de recursoListarObtenerCrearActualizarEliminarEjecutar acciones
templatexxxxx

Las operaciones de plantilla usan las rutas del servicio de Plantillas de Harness (/template/api/templates...). Crear y actualizar requieren la cadena YAML completa de la plantilla en body.template_yaml o body.yaml; version_label apunta a una versión específica para actualizar/eliminar, mientras que eliminar sin version_label elimina todas las versiones.

Paneles

Tipo de recursoListarObtenerCrearActualizarEliminarEjecutar acciones
dashboardxx
dashboard_datax

DevOps de bases de datos

Tipo de recursoListarObtenerCrearActualizarEliminarEjecutar acciones
database_schemaxxxxx
database_instancexxxxx
database_snapshot_objectxx
database_llm_authoring_pipelinex

Gestión de Infraestructura como Código (IaCM)

Los recursos de IaCM están habilitados por defecto y son mayormente de alcance de proyecto. Comience con iacm_workspace para encontrar identificadores de workspace, luego use ese workspace_id para recursos de workspace, costos y diferencias de actividad. Use iacm_variable_set para conjuntos de variables reutilizables en alcance de cuenta, organización o proyecto. El registro de proveedores tiene alcance de cuenta.

iacm_module abarca alcance de cuenta, organización y proyecto. Por defecto usa el registro de cuenta; cada operación (listar, obtener, crear, actualizar) envía los mismos parámetros de consulta scope_org / scope_project, por lo que un módulo que cree se puede descubrir en el alcance donde lo creó. Seleccione el alcance con resource_scope="account" | "org" | "project" más org_id/project_id. El alcance es opcional: cuando se omite resource_scope, org_id/project_id se aplican solo si los pasa explícitamente — los valores predeterminados configurados de HARNESS_ORG/HARNESS_PROJECT no se aplican, por lo que una configuración de proyecto ambiental no puede registrar silenciosamente un módulo de cuenta bajo un proyecto. Los campos propios org/project del cuerpo de un módulo ubican su conector Git y no están relacionados con este alcance de visibilidad.

La creación/actualización de iacm_workspace devuelve solo { policy_evaluation } — continúe con harness_get para obtener el workspace. La creación/actualización de iacm_variable_set y iacm_module devuelve el recurso en sí. La creación de iacm_provider devuelve solo { id } — continúe con harness_get; la actualización es solo orientada a versiones (POST/PUT /providers/{id}/version) — no hay PUT de metadatos. Las escrituras de versión pueden devolver un cuerpo vacío; HarnessClient lo normaliza a { status: "SUCCESS", message: "No content" }.

La actualización de conjuntos de variables es HTTP PUT con colecciones de reemplazo completo — siempre haga harness_get primero, luego PUT del cuerpo deseado completo (terraform_variables / environment_variables son obligatorios en la actualización; omitir/vaciar limpia conectores y archivos de variables). La actualización de módulos también es PUT — prefiera obtener-luego-PUT para campos opcionales. Las escrituras son medium_write y requieren confirmación (elicitación o confirm: true).

El RBAC de conjuntos de variables y registro de proveedores (iac_variableset_*, iac_providerregistry_*) es actualmente Experimental en Harness — las comprobaciones de acceso siempre permiten hasta que iac-server active la aplicación. El RBAC del registro de módulos (iac_registry_view / iac_registry_edit) está Activo y es aplicable. MCP siempre reenvía el PAT/SAT del llamante sin cambios.

Tipo de recursoListarObtenerCrearActualizarEliminarEjecutar acciones
iacm_workspacexxxx
iacm_variable_setxxxx
iacm_resourcex
iacm_modulexxxx
iacm_providerxxxx
iacm_workspace_costsx
iacm_activity_resource_changex

Flujo de trabajo típico:

  1. harness_list(resource_type="iacm_workspace", org_id="...", project_id="...") para encontrar el workspace.
  2. harness_create / harness_update en iacm_workspace para crear desde cero o desde una plantilla (associated_template), o actualizar un workspace existente — la respuesta es solo { policy_evaluation }.
  3. harness_get(resource_type="iacm_workspace", workspace_id="...") para obtener el workspace creado/actualizado.
  4. harness_list / harness_create / harness_update en iacm_variable_set (opcionalmente con resource_scope) para conjuntos de variables reutilizables de Terraform/env — la respuesta es el recurso VariableSet.
  5. harness_list / harness_create / harness_update en iacm_module para el registro de módulos (name + system obligatorios; agregue resource_scope con org_id/project_id para un módulo de alcance de organización o proyecto) — la respuesta es el recurso de módulo.
  6. harness_list / harness_create / harness_update en iacm_provider para el registro de proveedores de cuenta (body.type obligatorio para crear; crear devuelve solo { id } — luego harness_get; actualizar crea/actualiza solo versiones) — la actualización de versión puede devolver éxito vacío.
  7. harness_list(resource_type="iacm_resource", org_id="...", project_id="...", workspace_id="...") para inspeccionar recursos, salidas y fuentes de datos de Terraform.
  8. harness_list(resource_type="iacm_workspace_costs", org_id="...", project_id="...", workspace_id="...") para revisar entradas de costos por ejecución.
  9. harness_list(resource_type="iacm_activity_resource_change", org_id="...", project_id="...", activity_id="...", workspace_id="...") para inspeccionar diferencias de recursos antes/después para una actividad de plan, apply o destroy.

Las respuestas de listado de IaCM exponen page_count como el conteo solo para la página actual (excepto iacm_variable_set, que no está paginado). Cuando has_more es verdadero, siga solicitando la siguiente página basada en 1 y sume los conteos de página si necesita un total.

Portal Interno de Desarrolladores (IDP)

Tipo de recursoListarObtenerCrearActualizarEliminarEjecutar acciones
idp_entityxx
scorecardxx
scorecard_checkxx
scorecard_statsx
scorecard_check_statsx
idp_scorexx
idp_workflowxexecute
idp_tech_docx

Solicitudes de extracción (Pull Requests)

Tipo de recursoListarObtenerCrearActualizarEliminarEjecutar acciones
pull_requestxxxxclose, merge
pr_reviewerxxsubmit_review
pr_commentxx
pr_checkx
pr_activityx

Use harness_execute(resource_type="pull_request", action="close", ...) para una operación de cierre explícita. harness_update también acepta body.state (open o closed) y enruta los cambios de estado al endpoint dedicado de estado de PR de Harness Code; envíe las ediciones de título/descripción en una llamada de actualización separada.

Gestión de lanzamientos

Los recursos de Gestión de Lanzamientos (RMG) están habilitados por defecto. Los recursos de definición (release_process, release_activity) admiten listar/obtener/crear/actualizar/eliminar con body.yaml; llame a harness_schema(resource_type="release_process"|"release_activity") antes de crear/actualizar. Los recursos de ejecución monitorean lanzamientos en curso — la mayoría de las operaciones de listado requieren release_id (UUID de harness_list resource_type=release, o el slug de URL de la interfaz como identifier-1.0.0-abc). Pegue una URL de lanzamiento de RMG en harness_list para autocompletar release_id.

Las llamadas de RMG usan ${HARNESS_BASE_URL}/gateway/rmg con alcance de cuenta mediante el encabezado Harness-Account. El alcance de organización/proyecto usa alcance basado en encabezados cuando se proporcionan org_id/project_id. release_execution_phase es solo de listado — use el campo identifier de cada elemento de fase como params.phase_identifier al llamar a harness_get en recursos de entrada/salida de fase (no llame a harness_get en release_execution_phase en sí). El filtrado de status en el listado de lanzamientos se aplica del lado del cliente solo en la página actual; siga paginando con los mismos filtros cuando los resultados puedan abarcar varias páginas.

Tipo de RecursoListarObtenerCrearActualizarEliminarEjecutar Acciones
release_processxxxxx
release_activityxxxxx
releasexx
release_execution_phasex
release_execution_taskx
release_execution_activityx
release_inputx
release_execution_phase_inputx
release_execution_phase_outputx
release_execution_activity_inputx
release_execution_activity_outputx

Flujo de trabajo típico:

  1. harness_list(resource_type="release_process", org_id="...", project_id="...") para descubrir definiciones de procesos de orquestación.
  2. harness_schema(resource_type="release_process") (o release_activity) antes de crear/actualizar; luego harness_create / harness_update con body.yaml.
  3. harness_list(resource_type="release", org_id="...", project_id="...") para encontrar lanzamientos activos o recientes (retroceso predeterminado de 30 días; opcional filters.status, filters.search_term, filters.days_back).
  4. harness_get(resource_type="release", release_id="...") para detalles del lanzamiento.
  5. harness_list(resource_type="release_execution_phase", filters={ release_id: "..." }) para el estado de la fase; el mismo release_id para release_execution_task y release_execution_activity.
  6. harness_get en release_input, release_execution_phase_input, release_execution_phase_output, release_execution_activity_output, o release_execution_activity_input usando release_id más params.phase_identifier / params.activity_identifier / activity_execution_id como se documenta en cada recurso.

Feature Flags

Tipo de RecursoListarObtenerCrearActualizarEliminarEjecutar Acciones
fme_workspacex
fme_environmentxxxxx
fme_feature_flagxxxxxkill, restore, reallocate, archive, unarchive
fme_feature_flag_definitionxxxxxkill, restore, reallocate
fme_rollout_statusx
fme_rule_based_segmentxxxx
fme_rule_based_segment_definitionxxenable, disable, change_request
fme_traffic_typex
fme_identityxx
fme_standard_segmentxx
fme_segment_keysxx
fme_segmentxxxx
fme_segment_definitionxxxxx

Recursos FME (Split.io) — los recursos fme_* admiten alcance de doble modo: las llamadas heredadas pasan workspace_id y acceden a la API de Split.io (api.split.io); las llamadas más nuevas pasan org_id+project_id juntos y acceden a endpoints nativos de Harness (estándar HARNESS_API_KEY/HARNESS_BASE_URL, misma autenticación que cualquier otro recurso harness_*) en su lugar. Pasar tanto workspace_id como org_id/project_id en la misma llamada, o mezclar org_id con project_id solo, es un error: elige un modo por llamada. Cada operación a continuación está disponible en modo heredado, sin cambios. La cobertura del modo nativo de Harness es actualmente más limitada:

  • fme_workspace — sin equivalente nativo de Harness; solo heredado (se usa para descubrir valores de workspace_id).

  • fme_environmentlist de doble modo (workspace_id o org_id+project_id). get/create/update/delete son solo nativos de Harness (/fme/api/v4/environments) — MCP nunca tuvo un contrato workspace_id para esas operaciones. La lista nativa usa opcional offset/limit (máx. 100; harness_list size se asigna a limit); el sobre {data, limit, offset, totalCount} se promueve a items/total. La creación/actualización nativa usa isProduction (production aceptado como alias). La actualización nativa es JSON Merge Patch; name y isProduction no se pueden borrar. El nombre tiene un máximo de 15 caracteres.

  • fme_feature_flag — doble modo, ambas ramas completamente conectadas. Nativo de Harness (org_id+project_id): list/get/create/delete acceden a /fme/api/v4/feature-flags (cuerpo para create: name, trafficType, opcional description/tags/owners, según CreateFeatureFlagRequest); update envía un merge-patch a /fme/api/v4/feature-flags/{name}; archive/unarchive acceden a /fme/api/v4/feature-flags/{name}/archive|unarchive (solo opcional comment — sin title, según ArchiveUnarchiveRequest); kill/restore/reallocate acceden a /fme/api/v4/feature-flag-definitions/{name}/kill|restore|reallocate con environment_id como parámetro de consulta (opcional comment/title, según FeatureFlagDefinitionActionRequest).

  • fme_feature_flag_definitionget/create/update siguen siendo de doble modo (workspace_id o org_id+project_id). list/delete/kill/restore/reallocate son solo nativos de Harness (org_id+project_id) — MCP nunca tuvo un contrato workspace_id para esas operaciones. La lista nativa requiere feature_flag_name y usa offset/limit (predeterminado 100, máx. 100); no acepta environment_id. Eliminar y ejecutar requieren environment_id. Kill/restore/reallocate son las mismas acciones que en fme_feature_flag. El cuerpo de obtener/crear/actualizar coincide con el heredado (treatments, defaultTreatment, defaultRule, opcional rules/baselineTreatment/trafficAllocation/comment), más opcional title en modo nativo de Harness. La actualización nativa es JSON Merge Patch.

  • fme_rollout_statuslist de doble modo. Pasa org_id+project_id (preferido) o el obsoleto workspace_id. La paginación nativa usa offset/limit (máx. 100; harness_list size se asigna a limit); los resultados se promueven a items/total. Cada elemento tiene id, name y opcional description.

  • fme_rule_based_segment — (Obsoleto — ver fme_segment.) El modo nativo de Harness se rechaza en cada operación (list/get/create/delete) — usa fme_segment en su lugar; este recurso solo admite el contrato heredado workspace_id.

  • fme_rule_based_segment_definition — (Obsoleto — ver fme_segment_definition.) El modo nativo de Harness se rechaza en cada operación/acción (list/update/enable/disable/change_request) — usa fme_segment_definition en su lugar (sin equivalente enable/disable/change_request allí); este recurso solo admite el contrato heredado workspace_id/environment_id.

  • fme_traffic_typelist de doble modo. Pasa org_id+project_id (preferido) o el obsoleto workspace_id. La paginación nativa usa offset/limit (máx. 100; harness_list size se asigna a limit); los resultados se promueven a items/total. Cada elemento tiene id y name (sin displayAttributeId).

  • fme_identitycreate/update aún no están implementados si org_id+project_id se pasan juntos; de lo contrario, procede como una llamada heredada normal.

  • fme_standard_segment — (Obsoleto — ver fme_segment.) El modo nativo de Harness se rechaza en cada operación (list/get) — usa fme_segment en su lugar; este recurso solo admite el contrato heredado workspace_id. No hay operación create para este recurso en ningún modo.

  • fme_segment_keyslist/update aún no están implementados si org_id+project_id se pasan juntos; de lo contrario, procede como una llamada heredada normal.

  • fme_segmentlist/get/create/delete están conectados al endpoint real /fme/api/v4/segments (consolida fme_standard_segment/fme_rule_based_segment); cuerpo de create: name, trafficType, type (requerido — uno de standard/rule_based/large), opcional description/tags/owners.

  • fme_segment_definition — solo nativo de Harness (sin soporte heredado workspace_id). list/get/create/update/delete están conectados a /fme/api/v4/segment-definitions, según Harness_Split/Main PR #12644 (abierto, aún no fusionado al momento de escribir esto — las rutas pueden cambiar). update usa JSON Merge Patch en description, el único campo mutable. No hay acción enable/disable/change_request — el backend no tiene tales endpoints para este recurso unificado.

En modo de usuario único/autoalojado, la autenticación en modo heredado usa un token Bearer de HARNESS_FME_API_KEY, con respaldo a un HARNESS_API_KEY que no es un marcador de posición. HARNESS_FME_API_KEY puede ser una clave de administrador heredada de Split o un PAT/SAT de Harness con derecho FME, pero se rechaza en modo multi-user para que las implementaciones compartidas no puedan sobrescribir la credencial de cada usuario de sesión. Las credenciales de OAuth alojado/enrutamiento de servicios para las API de la plataforma Harness no autentican solicitudes directas a Split.io. fme_feature_flag admite la gestión completa del ciclo de vida en modo heredado: crear (requiere traffic_type_id), listar, obtener, actualizar metadatos, eliminar y acciones de ejecución kill/restore/reallocate/archive/unarchive. Usa fme_traffic_type para descubrir IDs de tipos de tráfico, fme_identity para crear/actualizar atributos de identidad, y fme_standard_segment / fme_segment_keys para inspeccionar segmentos estándar y agregar claves de miembros. fme_rule_based_segment proporciona CRUD para segmentos de segmentación, mientras que fme_rule_based_segment_definition gestiona reglas de segmento específicas del entorno con flujos de aprobación de habilitar/deshabilitar y solicitudes de cambio.

GitOps

Tipo de RecursoListarObtenerCrearActualizarEliminarEjecutar Acciones
gitops_agentxx
gitops_applicationxxsync
gitops_clusterxx
gitops_repositoryxx
gitops_applicationsetxx
gitops_repo_credentialxx
gitops_app_eventx
gitops_pod_logx
gitops_managed_resourcex
gitops_resource_actionx
gitops_dashboardx
gitops_app_resource_treex

Ingeniería del Caos

Tipo de RecursoListarObtenerCrearActualizarEliminarEjecutar Acciones
chaos_experimentxxxxrun, stop
chaos_experiment_runx
chaos_experiment_variablex
chaos_component_variablex
chaos_input_setxxxxx
chaos_experiment_templatexxxcreate_from_template, list_revisions, get_variables, get_yaml, compare_revisions
chaos_probexxxxenable, verify, get_manifest
chaos_probe_in_runx
chaos_probe_templatexxxget_variables
chaos_infrastructurex
chaos_k8s_infrastructurexxxcheck_health
chaos_enabled_infrastructurex
chaos_environmentx
chaos_hubxxxxx
chaos_hub_faultx
chaos_faultxxxget_variables, get_yaml
chaos_fault_templatexxxlist_revisions, get_variables, get_yaml, compare_revisions
chaos_fault_experiment_runx
chaos_actionxxxxget_manifest
chaos_action_templatexxxlist_revisions, get_variables, compare_revisions
chaos_loadtestxxxxxrun, stop
chaos_servicexxxxxlist_experiment_runs, list_load_tests
chaos_application_mapxx
discovered_agentx
discovered_namespacex
discovered_servicex
discovered_network_mapx
chaos_guard_conditionxxx
chaos_guard_rulexxxenable
chaos_recommendationxx
chaos_riskxx
chaos_dr_testxx
scanned_riskxxoccurrences, summary_by_service
chaos_risk_rulexx
chaos_risk_scanxxxxxretry, abort, report, report_download, heatmap

Gestión de Costos en la Nube (CCM)

Tipo de RecursoListarObtenerCrearActualizarEliminarEjecutar Acciones
cost_perspectivexxxxx
cost_breakdownx
cost_timeseriesx
cost_summaryxx
cost_recommendationxxupdate_state, override_savings, create_jira_ticket, create_snow_ticket
cost_anomalyx
cost_anomaly_summaryx
cost_categoryxx
cost_account_overviewx
cost_filter_valuex
cost_recommendation_statsx
cost_recommendation_detailx
cost_commitmentx

Información de Ingeniería de Software (SEI)

Los recursos de SEI se consolidan para eficiencia de tokens. Use los parámetros metric o aspect para detalles de DORA, equipo/árbol organizacional e información de IA.

Tipo de RecursoListarObtenerCrearActualizarEliminarEjecutar Acciones
sei_metricx
sei_productivity_metricx
sei_dora_metricxPasar metric: deployment_frequency, change_failure_rate, mttr, lead_time, o *_drilldown
sei_teamxx
sei_team_detailxPasar aspect: integrations, developers, integration_filters
sei_org_treexx
sei_org_tree_detailxxPasar aspect: efficiency_profile, productivity_profile, business_alignment_profile, integrations, teams
sei_business_alignmentxxPasar aspect: feature_metrics, feature_summary, drilldown para obtener
sei_ai_usagexxPasar aspect: metrics, breakdown, summary, top_languages
sei_ai_adoptionxxPasar aspect: metrics, breakdown, summary
sei_ai_impactxPasar aspect: pr_velocity, rework
sei_ai_raw_metricx

Garantía de Cadena de Suministro de Software (SCS)

Tipo de RecursoListarObtenerCrearActualizarEliminarEjecutar Acciones
scs_artifact_sourcex
artifact_securityxx
scs_artifact_componentx
scs_artifact_remediationx
scs_chain_of_custodyx
scs_compliance_resultx
code_repo_securityxx
scs_sbomx

Bóveda de Evidencias

La Bóveda de Evidencias almacena atestaciones in-toto (evidencias de SDLC). Listar admite alcance de cuenta/org/proyecto mediante resource_scope. Los filtros singulares de texto libre (pipeline, artifact solo, gitoid) usan search_term; una restricción adicional de Nombre usa filters.subject_name; el resumen de contenido del sujeto usa filters.subject_digest. Obtener busca por gitoid_sha256 y requiere org_id/project_id (de la fila de la lista). Descargar (acción harness_execute download) devuelve un download_url con límite de tiempo — muestra siempre ese enlace al usuario. Requiere el feature flag SCS_EVIDENCE_VAULT.

Tipo de RecursoListarObtenerCrearActualizarEliminarEjecutar Acciones
attestationxxdownload

Orquestación de Pruebas de Seguridad (STO)

Tipo de RecursoListarObtenerCrearActualizarEliminarEjecutar Acciones
security_issuex
security_issue_filterx
security_exemptionxxapprove, reject
remediation_diffx

La creación de security_exemption es una operación de high_write. El servidor deriva requester_id del PAT autenticado, establece exemptFutureOccurrences=true, y establece por defecto duration_days a 30 cuando no se proporciona. Para listar exenciones, pasa un tamaño de página explícito pequeño (por ejemplo filters: { "status": "Pending", "size": 5 }) y sigue el _nextPageHint devuelto en cada respuesta.

Flujo de trabajo de ejecución de exención de seguridad:

  • Usa harness_list con resource_type="security_exemption" y un status explícito como Pending, Approved, Rejected, Expired, o Canceled.
  • Usa harness_execute con action="approve" y un body.scope requerido: CURRENT, ACCOUNT, ORG, o PROJECT. CURRENT aprueba en el alcance existente de la exención; los otros alcances usan el endpoint de promoción de STO internamente. El servidor autocompleta body.approver_id desde el usuario autenticado cuando se omite; body.comment es opcional.
  • Usa action="reject" para rechazar una exención. body.approver_id también se autocompleta cuando se omite.
  • No hay una acción de ejecución separada de promote. Usa action="approve" con un body.scope no CURRENT cuando el resultado solicitado es aprobación en alcance de cuenta, organización o proyecto.

Control de Acceso

Tipo de RecursoListarObtenerCrearActualizarEliminarEjecutar Acciones
userxx
user_groupxxxx
service_accountxxxx
rolexxxx
role_assignmentxx
resource_groupxxxx
permissionx

Gobernanza

Tipo de RecursoListarObtenerCrearActualizarEliminarEjecutar Acciones
policyxxxxx
policy_setxxxxx
policy_evaluationxx

Congelación de Despliegues

Tipo de RecursoListarObtenerCrearActualizarEliminarEjecutar Acciones
freeze_windowxxxxxtoggle_status
global_freezexmanage

Anulaciones de Servicio

Tipo de RecursoListarObtenerCrearActualizarEliminarEjecutar Acciones
service_overridexxxxx

Configuración

Tipo de RecursoListarObtenerCrearActualizarEliminarEjecutar Acciones
settingx

Prompts de MCP

DevOps

PromptDescripciónParámetros
build-deploy-appFlujo de trabajo CI/CD de extremo a extremo: escanea un repositorio git, genera un pipeline de CI (compilar y publicar imagen Docker), descubre o genera manifiestos de K8s, crea un pipeline de CD e implementa — con reintento automático en fallos de CI (hasta 5 intentos) y fallos de CD (hasta 3 intentos con permiso del usuario). Cuando se agotan los reintentos, proporciona enlaces profundos de la interfaz de Harness a todos los recursos creados para investigación manual.repoUrl (obligatorio), imageName (obligatorio), projectId (opcional), namespace (opcional)
debug-pipeline-failureAnaliza una ejecución fallida: acepta un ID de ejecución, ID de pipeline o URL de Harness. Obtiene el desglose de etapas/pasos, detalles del fallo, información del delegado y registros del paso fallido mediante harness_diagnose, luego proporciona análisis de causa raíz y correcciones sugeridas. Sigue automáticamente fallos de pipelines encadenados.executionId (opcional), projectId (opcional)
pipeline_summarizerObtiene y resume TODOS los registros de pasos de una ejecución de pipeline. Usa harness_diagnose con include_logs: true, include_all_step_logs: true para obtener el registro de cada paso, luego presenta una tabla con Nombre del Paso, Estado, Duración y Qué Ocurrió (resumen basado en registros). NO omite ningún paso.executionId (opcional), projectId (opcional)
create-pipelineGenera un nuevo YAML de pipeline a partir de requisitos en lenguaje natural, revisando recursos existentes para contextodescription (obligatorio), projectId (opcional)
create-agentConstruye interactivamente un agente de IA de Harness — verifica agentes existentes, recopila requisitos, genera la especificación YAML del agente usando el esquema de pipeline de agente, confirma con el usuario, luego crea o actualiza mediante harness_create/harness_updateagent_name (obligatorio), task_description (obligatorio), org_id (opcional), project_id (opcional)
onboard-serviceGuía el proceso de incorporación de un nuevo servicio con entornos y un pipeline de implementaciónserviceName (obligatorio), projectId (opcional)
dora-metrics-reviewRevisa métricas DORA (frecuencia de implementación, tasa de fallos por cambios, MTTR, tiempo de entrega) con clasificación Elite/Alto/Medio/Bajo y recomendaciones de mejorateamRefId (opcional), dateStart (opcional), dateEnd (opcional)
setup-gitops-applicationGuía el proceso de incorporación de una aplicación GitOps — verifica agente, clúster, repositorio y crea la aplicaciónagentId (obligatorio), projectId (opcional)
chaos-resilience-testDiseña un experimento de caos para probar la resiliencia del servicio con inyección de fallos, sondas y resultados esperadosserviceName (obligatorio), projectId (opcional)
feature-flag-rolloutPlanifica y ejecuta un despliegue progresivo de feature flags entre entornos con compuertas de seguridadflagIdentifier (obligatorio), projectId (opcional)
migrate-pipeline-to-templateAnaliza un pipeline existente y extrae plantillas reutilizables de etapas/pasospipelineId (obligatorio), projectId (opcional)
delegate-health-checkVerifica conectividad del delegado, salud, estado del token y soluciona problemas de infraestructuraprojectId (opcional)
developer-portal-scorecardRevisa los scorecards de IDP para servicios e identifica brechas para mejorar la experiencia del desarrolladorprojectId (opcional)
pending-approvalsEncuentra ejecuciones de pipeline en espera de aprobación, muestra detalles y ofrece aprobar o rechazarprojectId (opcional), orgId (opcional), pipelineId (opcional)

FinOps

PromptDescripciónParámetros
optimize-costsAnaliza datos de costos en la nube, muestra recomendaciones y anomalías, priorizadas por ahorro potencialprojectId (opcional)
cloud-cost-breakdownAnálisis profundo de costos en la nube por servicio, entorno o clúster con análisis de tendencias y detección de anomalíasperspectiveId (opcional), projectId (opcional)
commitment-utilization-reviewAnaliza la utilización de instancias reservadas y planes de ahorro para encontrar desperdicio y optimizar compromisosprojectId (opcional)
cost-anomaly-investigationInvestiga anomalías de costos — determina causa raíz, recursos afectados y remediaciónprojectId (opcional)
rightsizing-recommendationsRevisa y prioriza recomendaciones de ajuste de tamaño, opcionalmente crea tickets en Jira o ServiceNowprojectId (opcional), minSavings (opcional)

DevSecOps

PromptDescripciónParámetros
security-reviewRevisa problemas de seguridad en recursos de Harness y sugiere remediaciones por severidadprojectId (opcional), severity (opcional, predeterminado: critical,high)
vulnerability-triageClasifica vulnerabilidades de seguridad en pipelines y artefactos, prioriza por severidad y explotabilidadprojectId (opcional), severity (opcional)
sbom-compliance-checkAudita SBOM y postura de cumplimiento para artefactos — riesgos de licencia, violaciones de políticas, vulnerabilidades de componentesartifactId (opcional), projectId (opcional)
supply-chain-auditAuditoría de seguridad de cadena de suministro de software de extremo a extremo — procedencia, cadena de custodia, cumplimiento de políticasprojectId (opcional)
security-exemption-reviewRevisa exenciones de seguridad pendientes y toma decisiones de aprobación o rechazo por lotesprojectId (opcional)
bulk-exemption-createCrea exenciones de seguridad justificadas para múltiples problemas de STO con alcance explícito y guía de duraciónprojectId (obligatorio), exemption_type (obligatorio), reason (obligatorio), filtros de problemas (opcional)
access-control-auditAudita permisos de usuario, cuentas con privilegios excesivos y asignaciones de roles para imponer el principio de mínimo privilegioprojectId (opcional), orgId (opcional)

Harness Code

PromptDescripciónParámetros
code-reviewRevisar una pull request — analizar diff, commits, checks y comentarios para proporcionar retroalimentación estructurada sobre errores, seguridad, rendimiento y estilorepoId (obligatorio), prNumber (obligatorio), projectId (opcional)
pr-summaryAuto-generar un título y descripción de PR a partir del historial de commits y el diff de una ramarepoId (obligatorio), sourceBranch (obligatorio), targetBranch (opcional, predeterminado: main), projectId (opcional)
branch-cleanupAnalizar ramas en un repositorio y recomendar ramas obsoletas o fusionadas para eliminarrepoId (obligatorio), projectId (opcional)

Recursos MCP

URI del recursoDescripciónTipo MIME
pipeline:///{pipelineId}Definición de YAML de pipelineapplication/x-yaml
pipeline:///{orgId}/{projectId}/{pipelineId}YAML de pipeline (con alcance explícito)application/x-yaml
executions:///recentResúmenes de las últimas 10 ejecuciones de pipelineapplication/json
schema:///pipelineEsquema JSON de pipeline de Harnessapplication/schema+json
schema:///templateEsquema JSON de plantilla de Harnessapplication/schema+json
schema:///triggerEsquema JSON de trigger de Harnessapplication/schema+json
schema:///pipeline_v1 (Alpha)Esquema JSON de pipeline V1 de Harness (formato simplificado de stages/steps)application/schema+json
schema:///agent-pipelineEsquema JSON de pipeline de agente de IA de Harnessapplication/schema+json

Filtrado de conjuntos de herramientas

Por defecto, 40 de 41 conjuntos de herramientas están habilitados. Un conjunto de herramientas es opcional y está excluido de los valores predeterminados:

  • ansible — Harness Ansible (inventarios, playbooks, hosts, actividad). Es opcional porque está limitado al proyecto y añade conceptos que muchos usuarios no necesitan.

Añadir conjuntos de herramientas con el prefijo +

Usa el prefijo + para incluir explícitamente conjuntos de herramientas opcionales junto con todos los valores predeterminados:

# Explicitly include Ansible alongside all defaults
HARNESS_TOOLSETS=+ansible

Eliminar conjuntos de herramientas predeterminados

Usa el prefijo - para excluir conjuntos de herramientas que no necesites:

# Remove chaos and ccm from defaults
HARNESS_TOOLSETS=-chaos,-ccm

Combinando + y -

# Add Ansible, remove chaos
HARNESS_TOOLSETS=+ansible,-chaos

Lista de permitidos explícita

Una lista explícita separada por comas (sin prefijos) reemplaza los valores predeterminados por completo. Solo los conjuntos de herramientas listados están habilitados:

# Only expose pipelines, services, and connectors
HARNESS_TOOLSETS=pipelines,services,connectors

Nombres de conjuntos de herramientas disponibles:

ToolsetTipos de recursos
platformorganization, project
pipelinespipeline, pipeline_v1, pipeline_dynamic_execution, execution, execution_inputs, trigger, pipeline_summary, input_set, approval_instance
agentsagent, agent_run
servicesservice
environmentsenvironment
connectorsconnector, connector_catalogue
infrastructureinfrastructure
secretssecret
logsexecution_log
auditaudit_event
delegatesdelegate, delegate_token
repositoriesrepository, branch, commit, file_content, tag, repo_rule, space_rule
registriesregistry, artifact, artifact_version, artifact_file
file_storefile_store
templatestemplate
dashboardsdashboard, dashboard_data
idpidp_entity, scorecard, scorecard_check, scorecard_stats, scorecard_check_stats, idp_score, idp_workflow, idp_tech_doc
pull-requestspull_request, pr_reviewer, pr_comment, pr_check, pr_activity
feature-flagsfme_workspace, fme_environment, fme_feature_flag, fme_feature_flag_definition, fme_rollout_status, fme_rule_based_segment, fme_rule_based_segment_definition, fme_traffic_type, fme_identity, fme_standard_segment, fme_segment_keys, fme_segment, fme_segment_definition
gitopsgitops_agent, gitops_application, gitops_cluster, gitops_repository, gitops_applicationset, gitops_repo_credential, gitops_app_event, gitops_pod_log, gitops_managed_resource, gitops_resource_action, gitops_dashboard, gitops_app_resource_tree
chaoschaos_experiment, chaos_experiment_run, chaos_experiment_variable, chaos_component_variable, chaos_input_set, chaos_experiment_template, chaos_probe, chaos_probe_in_run, chaos_probe_template, chaos_infrastructure, chaos_k8s_infrastructure, chaos_enabled_infrastructure, chaos_environment, chaos_hub, chaos_hub_fault, chaos_fault, chaos_fault_template, chaos_fault_experiment_run, chaos_action, chaos_action_template, chaos_loadtest, chaos_service, chaos_application_map, discovered_agent, discovered_namespace, discovered_service, discovered_network_map, chaos_guard_condition, chaos_guard_rule, chaos_recommendation, chaos_risk, chaos_dr_test, scanned_risk, chaos_risk_rule, chaos_risk_scan
ccmcost_perspective, cost_breakdown, cost_timeseries, cost_summary, cost_recommendation, cost_anomaly, cost_anomaly_summary, cost_category, cost_account_overview, cost_filter_value, cost_recommendation_stats, cost_recommendation_detail, cost_commitment
seisei_metric, sei_productivity_metric, sei_dora_metric, sei_team, sei_team_detail, sei_org_tree, sei_org_tree_detail, sei_business_alignment, sei_ai_usage, sei_ai_adoption, sei_ai_impact, sei_ai_raw_metric
scsscs_artifact_source, artifact_security, scs_artifact_component, scs_artifact_remediation, scs_chain_of_custody, scs_compliance_result, code_repo_security, scs_sbom
evidence-vaultattestation
stosecurity_issue, security_issue_filter, security_exemption, remediation_diff
dbopsdatabase_schema, database_instance, database_snapshot_object, database_llm_authoring_pipeline
access_controluser, user_group, service_account, role, role_assignment, resource_group, permission
governancepolicy, policy_set, policy_evaluation
freezefreeze_window, global_freeze
overridesservice_override
settingssetting
knowledge-graphkg_queryable_type_summary, kg_grammar, hql_query
semantic-layerkg_type, kg_related_type
ai-evalseval_dataset, eval_dataset_item, evaluation, eval_run, eval_run_item, eval_run_by_eval, eval_metric, eval_metric_set, eval_metric_set_entry, eval_suite, eval_suite_evaluation, eval_suite_run, eval_target, eval_annotation, eval_analytics, eval_git_settings, eval_registry_item, eval_git_registration, online_eval
iacmiacm_workspace, iacm_variable_set, iacm_resource, iacm_module, iacm_provider, iacm_workspace_costs, iacm_activity_resource_change
ansible (opt-in)ansible_inventory, ansible_playbook, ansible_host, ansible_host_activity, ansible_activity
release-managementrelease_process, release_activity, release, release_execution_phase, release_execution_task, release_execution_activity, release_input, release_execution_phase_input, release_execution_phase_output, release_execution_activity_input, release_execution_activity_output

Arquitectura

                 +------------------+
                 |   AI Agent       |
                 |  (Claude, etc.)  |
                 +--------+---------+
                          |  MCP (stdio or HTTP)
                 +--------v---------+
                |    MCP Server     |
                | 11 Generic Tools  |
                 +--------+---------+
                          |
                 +--------v---------+
                |    Registry       |  <-- Declarative resource definitions
                |  40 Toolsets      |      (data files, not code)
                |  243 Resource Types|
                 +--------+---------+
                          |
                 +--------v---------+
                 |  HarnessClient    |  <-- Auth, retry, rate limiting
                 +--------+---------+
                          |  HTTPS
                 +--------v---------+
                 |  Harness REST API |
                 +-------------------+

Cómo funciona

  1. Las herramientas son verbos genéricos: harness_list, harness_get, etc. Aceptan un parámetro resource_type que enruta al endpoint correcto de la API.
  2. El Registro asigna cada resource_type a un ResourceDefinition — una estructura de datos declarativa que especifica el método HTTP, la ruta URL, los mapeos de parámetros de ruta/consulta y la lógica de extracción de respuestas.
  3. El Despacho resuelve la definición del recurso, construye la solicitud HTTP (sustitución de ruta, parámetros de consulta, inyección de cuenta/org/proyecto consciente de resource_scope), llama a la API de Harness a través de HarnessClient y extrae los datos relevantes de la respuesta.
  4. El filtrado de conjuntos de herramientas (HARNESS_TOOLSETS) controla qué definiciones de recursos se cargan en el registro al inicio.
  5. La salida estructurada se declara con outputSchema de MCP; harness_list convierte arrays y envoltorios comunes de listas en structuredContent con forma de objeto para clientes estrictos.
  6. Los enlaces profundos se añaden automáticamente a las respuestas, proporcionando URLs directas de la interfaz de Harness para cada recurso.
  7. El modo compacto elimina metadatos verbosos de los resultados de listas, conservando solo campos accionables (identidad, estado, tipo, marcas de tiempo, enlaces profundos) para minimizar el uso de tokens.

Añadir un nuevo tipo de recurso

Crea un nuevo archivo en src/registry/toolsets/ o añade un recurso a un conjunto de herramientas existente:

// src/registry/toolsets/my-module.ts
import type { ToolsetDefinition } from "../types.js";

export const myModuleToolset: ToolsetDefinition = {
  name: "my-module",
  displayName: "My Module",
  description: "Description of the module",
  resources: [
    {
      resourceType: "my_resource",
      displayName: "My Resource",
      description: "What this resource represents",
      toolset: "my-module",
      scope: "project",                    // "project" | "org" | "account"
      identifierFields: ["resource_id"],
      listFilterFields: ["search_term"],
      operations: {
        list: {
          method: "GET",
          path: "/my-module/api/resources",
          queryParams: { search_term: "search", page: "page", size: "size" },
          responseExtractor: (raw) => raw,
          description: "List resources",
        },
        get: {
          method: "GET",
          path: "/my-module/api/resources/{resourceId}",
          pathParams: { resource_id: "resourceId" },
          responseExtractor: (raw) => raw,
          description: "Get resource details",
        },
      },
    },
  ],
};

Luego impórtalo en src/registry/index.ts y añádelo al array ALL_TOOLSETS. No se necesitan cambios en ningún archivo de herramientas.

Desarrollo

# Build
pnpm build

# Watch mode
pnpm dev

# Type check
pnpm typecheck

# Run tests
pnpm test

# Watch tests
pnpm test:watch

# Interactive MCP Inspector
pnpm inspect

# Refresh generated README counts from the built registry
pnpm docs:generate

# Verify README counts and clone instructions are current
pnpm docs:check

# Sync and verify JSON Schemas used by harness_schema
pnpm sync-schemas
pnpm check-schema-coverage

Estructura del proyecto

src/
  index.ts                          # Entrypoint, transport setup
  config.ts                         # Env var validation (Zod)
  client/
    harness-client.ts               # HTTP client (auth, retry, rate limiting)
    types.ts                        # Shared API types
  registry/
    index.ts                        # Registry class + dispatch logic
    types.ts                        # ResourceDefinition, ToolsetDefinition, etc.
    toolsets/                        # One file per toolset (declarative data)
      platform.ts
      pipelines.ts
      services.ts
      ccm.ts
      access-control.ts
      ...
  tools/                            # 11 generic MCP tools
    harness-list.ts
    harness-get.ts
    harness-create.ts
    harness-update.ts
    harness-delete.ts
    harness-execute.ts
    harness-search.ts
    harness-diagnose.ts
    harness-describe.ts
    harness-status.ts
    harness-schema.ts

  resources/                        # MCP resource providers
    pipeline-yaml.ts
    execution-summary.ts
  prompts/                          # MCP prompt templates
    build-deploy-app.ts             # DevOps: end-to-end build & deploy workflow
    debug-pipeline.ts               # DevOps: debug failed executions
    create-pipeline.ts              # DevOps: generate pipeline from requirements
    onboard-service.ts              # DevOps: onboard new service
    dora-metrics.ts                 # DevOps: DORA metrics review
    setup-gitops.ts                 # DevOps: GitOps application setup
    chaos-resilience.ts             # DevOps: chaos experiment design
    feature-flag-rollout.ts         # DevOps: progressive flag rollout
    migrate-to-template.ts          # DevOps: extract templates from pipeline
    delegate-health.ts              # DevOps: delegate health check
    developer-scorecard.ts          # DevOps: IDP scorecard review
    optimize-costs.ts               # FinOps: cost optimization
    cloud-cost-breakdown.ts         # FinOps: cost deep-dive
    commitment-utilization.ts       # FinOps: RI/savings plan analysis
    cost-anomaly.ts                 # FinOps: anomaly investigation
    rightsizing.ts                  # FinOps: rightsizing recommendations
    security-review.ts              # DevSecOps: security issue review
    vulnerability-triage.ts         # DevSecOps: vulnerability triage
    sbom-compliance.ts              # DevSecOps: SBOM compliance audit
    supply-chain-audit.ts           # DevSecOps: supply chain audit
    exemption-review.ts             # DevSecOps: exemption approval
    access-control-audit.ts         # DevSecOps: access control audit
    code-review.ts                  # Harness Code: PR code review
    pr-summary.ts                   # Harness Code: auto-generate PR summary
    branch-cleanup.ts               # Harness Code: stale branch cleanup
    pending-approvals.ts            # Approvals: find and act on pending approvals
  utils/
    cli.ts                          # CLI arg parsing (transport, port)
    errors.ts                       # Error normalization
    logger.ts                       # stderr-only logger
    progress.ts                     # MCP progress & logging notifications
    rate-limiter.ts                 # Client-side rate limiting
    deep-links.ts                   # Harness UI deep link builder
    response-formatter.ts           # Consistent MCP response formatting
    compact.ts                      # Compact list output for token efficiency
tests/
  config.test.ts                    # Config schema validation tests
  utils/
    response-formatter.test.ts
    deep-links.test.ts
    errors.test.ts
  registry/
    registry.test.ts                # Registry loading, filtering, dispatch tests

Elicitación

Las herramientas de escritura (harness_create, harness_update, harness_delete, harness_execute) utilizan elicitación MCP para solicitar confirmación al usuario cuando el riesgo de la acción lo requiere — solo operaciones medium_write, high_write y destructive. Las creaciones/actualizaciones/lecturas de bajo riesgo (p. ej. pipeline.create, pipeline.update, hql_query.run) proceden silenciosamente sin aviso. Cuando se muestra un aviso, el usuario ve lo que está a punto de suceder y lo acepta o rechaza, brindando una aprobación real de supervisión humana para las operaciones que realmente mutan o ejecutan cosas.

Cómo funciona:

  1. El LLM llama a una herramienta de escritura con riesgo medium_write+ (p. ej. harness_delete, harness_execute pipeline.run). Las creaciones/actualizaciones/lecturas de bajo riesgo no muestran un aviso.
  2. El servidor envía una solicitud de elicitación al cliente con un resumen de la operación y una casilla confirm (marcada por defecto).
  3. El usuario ve los detalles y hace clic en Aceptar (con confirm marcada) o Rechazar / Cancelar.
  4. Si se acepta con confirm: true, la operación procede. Si se acepta con confirm sin marcar, se rechaza o se cancela, se bloquea y se informa al LLM (un rechazo explícito es autoritativo y no se omite mediante confirm: true en la llamada a la herramienta).

Soporte del cliente:

ClienteSoporte de elicitación
Cursor
VS Code (Copilot)
Claude DesktopAún no
Devin DesktopAún no
MCP Inspector

El comportamiento de elicitación varía según el riesgo de la operación cuando falta soporte del cliente:

Nivel de riesgoEl cliente soporta elicitaciónconfirm: true pasadoComportamiento
read, low_writecualquieracualquieraProcede silenciosamente — no se muestra ningún aviso (confirm no tiene efecto en este nivel de riesgo)
medium_write, high_write, destructivecualquieraSolicita al usuario. Procede solo si el usuario acepta con confirm: true (el valor predeterminado del esquema). Un rechazo explícito, cancelación o aceptación con confirm: false (el usuario desmarcó la casilla) es autoritativo y no se omite mediante confirm: true en la llamada a la herramienta. Una aceptación que carece del campo confirm se trata como si el cliente no hubiera mostrado un aviso utilizable — recuperable reintentando con confirm: true
medium_write, high_write, destructiveNoNoBLOQUEAR (devolver error con sugerencia de reintentar con confirm: true)
medium_write, high_write, destructiveNoProcede (aceptación explícita para automatización no interactiva)
cualquiera (en o por debajo de HARNESS_AUTO_APPROVE_RISK)cualquieracualquieraAutoaprobación sin solicitar

Si elicitInput falla en tiempo de ejecución (error de transporte, método no soportado) para una operación medium_write+, la llamada se bloquea a menos que el llamador pase confirm: true. confirm: true se respeta como respaldo cuando el cliente no pudo mostrar un aviso o devolvió una aceptación degenerada ({action: "accept"} sin el campo de confirmación), pero no anula un rechazo/cancelación explícito de un cliente que completó el protocolo de elicitación.

Modo autónomo

El modo autónomo significa que el servidor procede con todas las operaciones — incluidas escrituras y acciones destructivas — sin solicitar confirmación. Actívalo configurando:

HARNESS_AUTO_APPROVE_RISK=all

Este es el límite a nivel de implementación: una vez establecido, las sesiones individuales no pueden superarlo (aunque pueden elegir un umbral más estricto por sesión mediante el encabezado x-harness-auto-approve-risk).

O en la configuración de tu cliente MCP:

{
  "mcpServers": {
    "harness": {
      "command": "npx",
      "args": ["harness-mcp-v2"],
      "env": {
        "HARNESS_API_KEY": "pat.xxx.xxx.xxx",
        "HARNESS_AUTO_APPROVE_RISK": "all"
      }
    }
  }
}

Autonomía parcial: También puedes autoaprobar solo hasta un nivel de riesgo específico mientras sigues solicitando confirmación para operaciones de mayor riesgo:

# Auto-approve reads and low-risk writes; prompt for medium_write, high_write, destructive
HARNESS_AUTO_APPROVE_RISK=low_write

# Auto-approve up to high-risk writes; only prompt for destructive operations
HARNESS_AUTO_APPROVE_RISK=high_write
ValorQué se autoaprueba
none (predeterminado)Nada — sin umbral de autoaprobación
low_writeLecturas + escrituras de bajo riesgo
medium_writeLecturas + escrituras de riesgo bajo y medio
high_writeLecturas + escrituras de riesgo bajo, medio y alto
allTodo, incluidas operaciones destructivas

Advertencia sobre el modo autónomo: HARNESS_AUTO_APPROVE_RISK=all omite la confirmación para todas las operaciones, incluidas harness_delete. Úsalo con precaución y considera combinarlo con HARNESS_TOOLSETS para restringir qué tipos de recursos están disponibles.

Nota de migración: HARNESS_SKIP_ELICITATION=true sigue siendo compatible y se asigna a HARNESS_AUTO_APPROVE_RISK=all. Se registra una advertencia de obsolescencia en stderr. Si ambos están configurados, HARNESS_AUTO_APPROVE_RISK tiene prioridad.

Seguridad

  • Los secretos nunca se exponen. El tipo de recurso secret devuelve solo metadatos (nombre, tipo, alcance) — los valores de los secretos nunca se incluyen en ninguna respuesta.
  • Las operaciones que requieren confirmación usan elicitación cuando está disponible. Cuando una acción de escritura o ejecución tiene riesgo medium_write, high_write o destructive, harness_create, harness_update, harness_delete y harness_execute intentan la elicitación MCP antes de proceder (ver Elicitación). Las acciones de bajo riesgo (read, low_write — p. ej. pipeline.create, pipeline.update, hql_query.run) proceden silenciosamente sin aviso.
  • Riesgo medio y superior fallan de forma segura. Si no se puede obtener confirmación para operaciones medium_write, high_write o destructive, se bloquean en lugar de ejecutarse a ciegas. Anula con HARNESS_AUTO_APPROVE_RISK para flujos de trabajo autónomos.
  • CORS restringido al mismo origen. El transporte HTTP solo permite solicitudes del mismo origen, lo que previene ataques CSRF de sitios web maliciosos dirigidos al servidor MCP en localhost.
  • Limitación de velocidad HTTP. El transporte HTTP aplica 60 solicitudes por minuto por IP para prevenir inundaciones de solicitudes.
  • Limitación de velocidad de API. El cliente de la API de Harness aplica un límite de 10 solicitudes por segundo para evitar alcanzar los límites de velocidad ascendentes.
  • Límites de paginación aplicados. Las consultas de listas están limitadas a 10,000 elementos en total y 100 por página para prevenir el agotamiento de memoria.
  • Reintentos con retroceso. Los fallos transitorios (HTTP 429, 5xx) se reintentan con retroceso exponencial y fluctuación.
  • Vinculación a localhost. El transporte HTTP se vincula a 127.0.0.1 por defecto — no accesible desde la red.
  • Sin registro en stdout. Todos los registros van a stderr para evitar corromper el transporte JSON-RPC de stdio.

Habilidades complementarias

El servidor MCP de Harness se combina bien con Harness Skills — una colección de habilidades listas para usar de Claude Code (comandos de barra) diseñadas para flujos de trabajo comunes de Harness. Instálalos junto con este servidor MCP para obtener automatización de alto nivel como /deploy, /rollback, /triage y más sin escribir avisos personalizados.

Solución de problemas y errores comunes

SíntomaCausa probableQué hacer
HARNESS_ACCOUNT_ID is required when the API key does not include an account ID segment...La clave de API no está en un formato compatible con el ámbito de cuenta (pat.<accountId>... o sat.<accountId>...), por lo que no se puede inferir el ID de cuentaEstablezca HARNESS_ACCOUNT_ID explícitamente
Unknown transport: "..." al inicioArgumento de transporte CLI no compatibleUse solo stdio o http
Invalid HARNESS_TOOLSETS: ... al inicioUno o más nombres de conjuntos de herramientas no son reconocidosUse solo nombres de Filtrado de conjuntos de herramientas (coincidencia exacta)
HTTP mcp-session-id header is required...Se envió una solicitud de sesión sin el encabezado de sesiónEnvíe initialize primero, luego incluya mcp-session-id en POST/GET/DELETE /mcp
HTTP Session not found...La sesión expiró después de MCP_SESSION_TTL_MS milisegundos de inactividad o ya se cerróVuelva a ejecutar initialize para crear una nueva sesión y luego reintente con el nuevo encabezado
HTTP 405 Method Not Allowed en /mcpMétodo no compatible para el endpoint de MCPUse solo POST, GET, DELETE o OPTIONS
HTTP Invalid requestCuerpo JSON no válido o el cuerpo de la solicitud superó HARNESS_MAX_BODY_SIZE_MBValide el tamaño/forma de la carga útil JSON; aumente HARNESS_MAX_BODY_SIZE_MB si es necesario
Unknown resource_type "..." de las herramientasEl tipo de recurso está mal escrito o filtrado mediante HARNESS_TOOLSETSLlame a harness_describe (con search_term opcional) para descubrir tipos válidos
Missing required field "... for path parameter ..."Una llamada con ámbito de proyecto/org carece de identificadoresEstablezca HARNESS_ORG/HARNESS_PROJECT o pase org_id/project_id por llamada de herramienta
resource_scope "org" requires org_id... o resource_scope "project" requires project_id...Un recurso de múltiples ámbitos se forzó al ámbito de org/proyecto sin suficientes identificadoresPase los org_id/project_id faltantes, configure HARNESS_ORG/HARNESS_PROJECT, o use resource_scope: "account" cuando sea compatible
Read-only mode is enabled ... operations are not allowedHARNESS_READ_ONLY=true bloquea crear/actualizar/eliminar/ejecutarEstablezca HARNESS_READ_ONLY=false si se pretenden operaciones de escritura
La ejecución de pipeline falla antes del vuelo con entradas requeridas sin resolverEl inputs proporcionado no cubrió los marcadores de posición de tiempo de ejecución requeridosObtenga runtime_input_template, suministre claves simples faltantes, o use input_set_ids para entradas estructurales
La abreviatura de CI de pipeline (branch, tag, pr_number, commit_sha) no se aplicóinputs.build ya se proporcionó, por lo que la expansión de abreviatura se omitió intencionalmenteElimine inputs.build para usar la expansión de abreviatura, o mantenga la estructura completa explícita de build
La ejecución de pipeline cargó la revisión YAML incorrectaLa definición del pipeline se almacena en Git y la ejecución no especificó la rama de pipeline deseadaPase params.pipeline_branch en la acción run; esto se asigna a Harness pipelineBranchName
wait: true devolvió _wait.errorEl disparador del pipeline tuvo éxito, pero la consulta del lado del servidor fallóVuelva a verificar el execution_id con harness_get(resource_type="execution", ...) antes de decidir si volver a ejecutar
wait: true devolvió execution_timed_out: trueLa ejecución no alcanzó un estado terminal antes de wait_timeout_secondsUse el execution_id devuelto para volver a verificar el estado; espere un estado terminal antes de ejecutar harness_diagnose
Los registros de ejecución están vacíos o las descargas de blobs devuelven 403Las URL de blobs de registros alojados por Harness requieren la ruta de cliente/auth de Harness configurada, especialmente para hosts internos o autogestionadosMantenga HARNESS_BASE_URL apuntando al host de Harness objetivo y use harness_get(resource_type="execution_log", ...) o harness_diagnose(..., include_logs=true) en lugar de omitir el cliente MCP
Operation declined by user / Operation cancelled by userEl usuario rechazó o canceló el diálogo de confirmación de elicitación — autoritativoVerifique los detalles de la operación con el usuario; confirm: true no omite un rechazo explícito. El usuario debe aceptar la solicitud
Operation blocked: the client could not surface a usable confirmation promptEl cliente carece de soporte de elicitación, elicitInput falló o devolvió una aceptación degeneradaReintente con confirm: true para automatización no interactiva, o use un cliente que admita elicitación
body.template_yaml (or body.yaml) is required para crear/actualizar plantillasLas API de plantillas esperan una carga útil YAML completaProporcione la cadena completa de template_yaml en body; para eliminaciones, pase version_label para eliminar una versión (omita para eliminar todas las versiones)
HARNESS_BASE_URL must use HTTPS al inicioHARNESS_BASE_URL está configurado a una URL HTTPUse HTTPS, o establezca HARNESS_ALLOW_HTTP=true para desarrollo local

Licencia

MIT