ninjaone-mcp
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_boardsy luegoninjaone_get_tickets"Ejecuta la limpieza de disco en este dispositivo y avísame cuando termine" →
ninjaone_get_device_scripting_optionspara confirmar qué se puede ejecutar,ninjaone_run_script_on_devicey luegoninjaone_get_device_active_jobspara 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 --buildEl servidor se inicia en http://localhost:8080.
Local (uv)
uv sync
python -m ninjaone_mcpComprobació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 |
| string | Sí | 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. |
|
| string | Sí | Ninguno | Ninguno (texto libre) | Secreto de cliente de la misma aplicación OAuth2. |
|
| string | No |
|
| Región de implementación de NinjaOne; determina la URL base real de la solicitud. |
|
Si falta alguna de las cabeceras obligatorias, se devuelve 401 No autorizado.
Variables de entorno
Variable | Valor predeterminado | Descripción |
|
| Puerto de escucha |
|
| 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/mcpConecta 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 |
| Listar todas las organizaciones de clientes |
|
| Consultar detalles de una organización por ID |
|
| Crear una nueva organización |
|
| Listar ubicaciones de una organización |
|
| Listar dispositivos de una organización |
|
| Listar dispositivos globalmente, admite expresiones de filtro |
|
| Consultar detalles de un dispositivo por ID |
|
| Consultar alertas activas de un dispositivo |
|
| Consultar registros de actividad de un dispositivo |
|
| Consultar la lista de servicios de Windows de un dispositivo |
|
| Reiniciar un dispositivo (operación destructiva) |
|
| Listar alertas activas globalmente |
|
| Restablecer/cerrar una alerta (operación destructiva) |
|
| Listar todos los tableros de tickets | Ninguno |
| Listar tickets por tablero, admite filtros por estado/organización/dispositivo |
|
| Crear un nuevo ticket |
|
| Actualizar campos de un ticket y/o agregar comentarios |
|
| Consultar registros de un ticket (descripción/comentarios/historial de cambios) |
|
| Listar scripts de automatización disponibles | Ninguno |
| Consultar scripts/acciones integradas/opciones de credenciales ejecutables en un dispositivo |
|
| Ejecutar un script o acción integrada en un dispositivo (operación destructiva) |
|
| Listar trabajos en ejecución/en cola globalmente |
|
| Consultar trabajos en ejecución/en cola de un dispositivo |
|
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 paraeu/oc/ca/us2/fed)Autenticación: concesión OAuth2
client_credentialsenPOST /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.getAutomationScriptsno estaba presente en esa copia (es más reciente que esa revisión de la especificación); su ubicación exacta en la ruta/apise infiere del patrón confirmado de los otros 4, no se verificó de forma independiente. Véase el comentario al principio detools/automation.py.ninjaone_get_ticketsfiltra en el lado del cliente: el esquema de solicitud del endpoint de tablero de NinjaOne define los parámetrosfilters/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 filtrastatus/organization_id/device_iden 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 deninjaone_get_ticketsen su tablero. Añadir un comentario tampoco es un endpoint independiente: está integrado en los parámetroscomment/comment_publicdeninjaone_update_ticket, junto con unPUTsobre el propio ticket.El filtro
dfdeninjaone_get_devicespuede ser descartado silenciosamente por NinjaOne al acotar por organización (un problema conocido en el proyecto comunitario); se prefiereninjaone_get_organization_devicespara 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/listdevuelve 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/tokende 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.
This server cannot be installed
Maintenance
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.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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