Skip to main content
Glama
MSPbotsAI

ninjaone-mcp

by MSPbotsAI

ninjaone-mcp

NinjaOne RMM servidor MCP: expone la API pública v2 de NinjaOne (organizaciones, dispositivos, alertas, tickets, automatización/scripts, trabajos) como herramientas MCP.

Qué es NinjaOne / cuándo debería usarlo un agente

NinjaOne es una plataforma RMM (monitoreo y gestión remota) que los proveedores de servicios gestionados (MSP) usan para administrar las flotas de TI de sus clientes. Un agente debería recurrir a este MCP para solicitudes como:

  • "¿Cuántos dispositivos tiene este cliente y cuáles están sin conexión?" → ninjaone_get_organization_devices / ninjaone_get_devices

  • "¿Hay alertas activas para este dispositivo/organización?" → ninjaone_get_device_alerts / ninjaone_get_alerts

  • "¿Qué tickets están abiertos en el tablero de soporte?" → ninjaone_get_ticket_boards y luego ninjaone_get_tickets

  • "Ejecuta la limpieza de disco en este dispositivo y avísame cuando termine" → ninjaone_get_device_scripting_options para confirmar qué se puede ejecutar, ninjaone_run_script_on_device y luego ninjaone_get_device_active_jobs para ver cuándo termina

  • "¿Qué scripts de automatización tenemos disponibles?" → ninjaone_get_automation_scripts

Descripción general

Este servidor implementa el Protocolo de contexto de modelo (transporte HTTP Streamable) con 23 herramientas en 5 grupos, siguiendo el estándar Vendor MCP Service SOP de MSPbots: sin estado, sin credenciales almacenadas y autenticación por cabecera en cada solicitud.

Se construyó a partir de la superficie de herramientas del proyecto comunitario wyre-technology/ninjaone-mcp (organizaciones/dispositivos/alertas/tickets, reimplementadas aquí directamente contra la API REST de NinjaOne en lugar de su SDK de Node) y se amplía con 5 herramientas de automatización/scripts/trabajos extraídas de la especificación OpenAPI 3.0.1 de NinjaOne; cada endpoint a continuación se verificó contra una especificación real de la API de NinjaOne, no se adivinó ni se copió de una fuente secundaria.

NinjaOne autentica mediante OAuth2 client_credentials: el ID de cliente y el secreto de una aplicación OAuth2 de "API Services" de NinjaOne se intercambian por un token de portador de corta duración en POST {base_url}/oauth/token. Este servidor realiza ese intercambio por sí mismo, de nuevo en cada llamada a la herramienta; nunca almacena ni guarda en caché un token (ni el client_id/secreto) entre llamadas.

Inicio rápido

Docker (recomendado)

docker compose up --build

El servidor se inicia en http://localhost:8080.

Local (uv)

uv sync
python -m ninjaone_mcp

Comprobación de estado

curl http://localhost:8080/health
# {"status": "ok"}

No se requieren credenciales para el endpoint de estado.

Parámetros de autenticación

Cada solicitud a /mcp debe incluir las siguientes cabeceras HTTP:

Cabecera

Tipo

Obligatorio

Valor predeterminado

Valores posibles

Descripción

Ejemplo

X-Ninja-Client-Id

string

Ninguno

Ninguno (texto libre)

ID de cliente de una aplicación OAuth2 de tipo "API Services" de NinjaOne (creada en la consola de NinjaOne en Administración → Aplicaciones → API). Este servicio lo usa para obtener un token de portador de corta duración y nunca lo guarda en disco.

X-Ninja-Client-Id: <client_id>

X-Ninja-Client-Secret

string

Ninguno

Ninguno (texto libre)

Secreto de cliente de la misma aplicación OAuth2.

X-Ninja-Client-Secret: <client_secret>

X-Ninja-Region

string

No

us

us, eu, oc, ca, us2, fed

Región de implementación de NinjaOne; determina la URL base real de la solicitud.

X-Ninja-Region: eu

Si falta alguna de las cabeceras obligatorias, se devuelve 401 No autorizado.

Variables de entorno

Variable

Valor predeterminado

Descripción

MCP_HTTP_PORT

8080

Puerto de escucha

MCP_HTTP_HOST

0.0.0.0

Host de escucha

No hay variable de entorno para la URL base: la URL base se deriva por solicitud de la cabecera X-Ninja-Region (consulta la tabla de regiones en config.py).

Endpoint MCP

POST http://localhost:8080/mcp

Conecta tu cliente MCP con:

  • Transporte: http (HTTP Streamable)

  • Cabeceras: X-Ninja-Client-Id, X-Ninja-Client-Secret (ambas obligatorias), X-Ninja-Region (opcional)

Lista de herramientas

Herramienta

Función

Parámetros

ninjaone_get_organizations

Listar todas las organizaciones de clientes

limit?, after?

ninjaone_get_organization

Consultar detalles de una organización por ID

organization_id (obligatorio)

ninjaone_create_organization

Crear una nueva organización

name (obligatorio), description?, node_approval_mode?, tags?, template_organization_id?

ninjaone_get_organization_locations

Listar ubicaciones de una organización

organization_id (obligatorio)

ninjaone_get_organization_devices

Listar dispositivos de una organización

organization_id (obligatorio), limit?, after?

ninjaone_get_devices

Listar dispositivos globalmente, admite expresiones de filtro df

df?, limit?, after?

ninjaone_get_device

Consultar detalles de un dispositivo por ID

device_id (obligatorio)

ninjaone_get_device_alerts

Consultar alertas activas de un dispositivo

device_id (obligatorio)

ninjaone_get_device_activities

Consultar registros de actividad de un dispositivo

device_id (obligatorio), activity_type?, status?, older_than?, newer_than?, limit?

ninjaone_get_device_services

Consultar la lista de servicios de Windows de un dispositivo

device_id (obligatorio), name?, state?

ninjaone_reboot_device

Reiniciar un dispositivo (operación destructiva)

device_id (obligatorio), mode? ("NORMAL"/"FORZADO", predeterminado NORMAL), reason?

ninjaone_get_alerts

Listar alertas activas globalmente

source_type?, df?

ninjaone_reset_alert

Restablecer/cerrar una alerta (operación destructiva)

alert_uid (obligatorio), activity_note?

ninjaone_get_ticket_boards

Listar todos los tableros de tickets

Ninguno

ninjaone_get_tickets

Listar tickets por tablero, admite filtros por estado/organización/dispositivo

board_id (obligatorio), status?, organization_id?, device_id?, limit?, cursor?

ninjaone_create_ticket

Crear un nuevo ticket

summary (obligatorio), organization_id (obligatorio), description?, device_id?, location_id?, ticket_form_id?, status?, priority?, severity?, type?

ninjaone_update_ticket

Actualizar campos de un ticket y/o agregar comentarios

ticket_id (obligatorio), summary?, status?, priority?, assignee_id?, comment?, comment_public?

ninjaone_get_ticket_log_entries

Consultar registros de un ticket (descripción/comentarios/historial de cambios)

ticket_id (obligatorio), entry_type?

ninjaone_get_automation_scripts

Listar scripts de automatización disponibles

Ninguno

ninjaone_get_device_scripting_options

Consultar scripts/acciones integradas/opciones de credenciales ejecutables en un dispositivo

device_id (obligatorio)

ninjaone_run_script_on_device

Ejecutar un script o acción integrada en un dispositivo (operación destructiva)

device_id (obligatorio), type (obligatorio, "SCRIPT"/"ACTION"), script_id?, action_uid?, parameters?, run_as?

ninjaone_get_active_jobs

Listar trabajos en ejecución/en cola globalmente

job_type?, df?

ninjaone_get_device_active_jobs

Consultar trabajos en ejecución/en cola de un dispositivo

device_id (obligatorio)

Ejemplo de prueba

Listar tableros de tickets:

{
  "method": "tools/call",
  "params": { "name": "ninjaone_get_ticket_boards", "arguments": {} }
}

Equivalente en curl contra el servidor en ejecución (endpoint MCP HTTP Streamable):

curl -X POST http://localhost:8080/mcp \
  -H "Content-Type: application/json" \
  -H "X-Ninja-Client-Id: <client_id>" \
  -H "X-Ninja-Client-Secret: <client_secret>" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": { "name": "ninjaone_get_ticket_boards", "arguments": {} }
  }'

Ejecutar un script en un dispositivo:

{
  "method": "tools/call",
  "params": {
    "name": "ninjaone_run_script_on_device",
    "arguments": { "device_id": 123, "type": "SCRIPT", "script_id": 456 }
  }
}

Referencia de la API

  • Documentación: https://app.ninjarmm.com/apidocs-beta/core-resources (equivalentes por región para eu/oc/ca/us2/fed)

  • Autenticación: concesión OAuth2 client_credentials en POST /oauth/token (grant_type, client_id, client_secret, scope), ámbitos: monitoring, management, control

Limitaciones conocidas / Notas de implementación

  • Procedencia de los endpoints: 4 de los 5 endpoints de automatización/scripting/trabajos (requestScriptingOptions, runScriptOnDevice, getActiveJobs, getDeviceActiveJobs) se contrastaron con una copia obtenida de forma independiente de la especificación OpenAPI de NinjaOne. getAutomationScripts no estaba presente en esa copia (es más reciente que esa revisión de la especificación); su ubicación exacta en la ruta /api se infiere del patrón confirmado de los otros 4, no se verificó de forma independiente. Véase el comentario al principio de tools/automation.py.

  • ninjaone_get_tickets filtra en el lado del cliente: el esquema de solicitud del endpoint de tablero de NinjaOne define los parámetros filters/searchCriteria, pero el proyecto comunitario wyre-technology informa de que estos devuelven un error 400 en la práctica; esta herramienta siempre solicita una página sin filtrar y filtra status/organization_id/device_id en el lado del cliente.

  • No existe un endpoint de obtención de ticket individual ni de añadir comentario de forma independiente: la API de ticketing de NinjaOne no expone un GET /ticketing/ticket/{id}; para consultar un ticket, hay que recorrer las páginas de ninjaone_get_tickets en su tablero. Añadir un comentario tampoco es un endpoint independiente: está integrado en los parámetros comment/comment_public de ninjaone_update_ticket, junto con un PUT sobre el propio ticket.

  • El filtro df de ninjaone_get_devices puede ser descartado silenciosamente por NinjaOne al acotar por organización (un problema conocido en el proyecto comunitario); se prefiere ninjaone_get_organization_devices para una lista de dispositivos acotada por organización.

  • Aún no se ha probado contra una cuenta real de NinjaOne con credenciales reales; lo verificado hasta ahora: tools/list devuelve las 23 herramientas con esquemas limpios, pytest (15 pruebas) pasa, y una llamada en vivo con un client_id/secret ficticio llegó al endpoint real de producción /oauth/token de NinjaOne y obtuvo un rechazo real y bien formado (Client app not exist) en lugar de un error de solicitud mal formada, lo que confirma que la URL base, el endpoint de token y el formato de solicitud son correctos.

-
license - not tested
Not graded
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

  • An MCP server that let you interact with Cycloid.io Internal Development Portal and Platform

  • MCP Server for agents to onboard, pay, and provision services autonomously with InFlow

  • MCP server for Pentest-Tools.com: run scans, manage findings and reports via your preffered LLM.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/MSPbotsAI/ninjaone-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server