Skip to main content
Glama
MSPbotsAI

ninjaone-mcp

by MSPbotsAI

ninjaone-mcp

NinjaOne RMM MCP 服务器——将 NinjaOne 公共 API v2(组织、设备、告警、工单、自动化/脚本、任务)以 MCP 工具的形式暴露出来。

什么是 NinjaOne / 代理在什么情况下会使用它

NinjaOne 是一个 RMM(远程监控和管理)平台,MSP 用它来管理客户的 IT 设备群。当出现以下请求时,代理应使用此 MCP:

  • "这个客户有多少台设备,哪些处于离线状态?" → ninjaone_get_organization_devices / ninjaone_get_devices

  • "这个设备/组织有活跃告警吗?" → ninjaone_get_device_alerts / ninjaone_get_alerts

  • "支持看板上有哪些未关闭的工单?" → ninjaone_get_ticket_boards,然后 ninjaone_get_tickets

  • "在这台设备上运行磁盘清理,完成后告诉我" → 使用 ninjaone_get_device_scripting_options 确认可运行内容,ninjaone_run_script_on_device 执行,然后通过 ninjaone_get_device_active_jobs 监控完成情况

  • "我们有哪些可用的自动化脚本?" → ninjaone_get_automation_scripts

概述

该服务器实现了模型上下文协议(Streamable HTTP 传输),包含 5 组共 23 个工具,遵循 MSPbots 供应商 MCP 服务 SOP:无状态、不存储凭据、按请求进行 Header 认证。

本项目基于社区 wyre-technology/ninjaone-mcp 项目的工具面(组织/设备/告警/工单,此处直接针对 NinjaOne 的 REST API 而非其 Node SDK 重新实现)构建,并扩展了 5 个来自 NinjaOne 自身 OpenAPI 3.0.1 规范的自动化/脚本/任务工具——以下每个端点都对照真实的 NinjaOne API 规范进行了验证,而非猜测或从二手来源复制。

NinjaOne 通过 OAuth2 client_credentials 进行身份验证:在 POST {base_url}/oauth/token 处,使用 NinjaOne "API Services" OAuth2 应用的客户端 ID + 密钥交换短期 bearer 令牌。该服务器自行完成此交换,每次工具调用都会重新获取——它从不在调用之间存储或缓存令牌(或 client_id/secret)。

快速开始

Docker(推荐)

docker compose up --build

服务器启动在 http://localhost:8080

本地(uv)

uv sync
python -m ninjaone_mcp

健康检查

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

健康检查端点不需要凭据。

授权参数说明 (Authentication)

/mcp 的每个请求都必须包含以下 HTTP 请求头:

Header

类型

是否必填

默认值

枚举值

字段描述

Example

X-Ninja-Client-Id

string

必填

无(自由文本)

NinjaOne 一个 "API Services" 类型 OAuth2 App 的 Client ID(在 NinjaOne 后台 Administration → Apps → API 创建),本服务用它换取短期 bearer token,从不落盘存储。

X-Ninja-Client-Id: <client_id>

X-Ninja-Client-Secret

string

必填

无(自由文本)

同一个 OAuth2 App 的 Client Secret。

X-Ninja-Client-Secret: <client_secret>

X-Ninja-Region

string

可选

us

us, eu, oc, ca, us2, fed

NinjaOne 部署区域,决定实际请求的 base URL。

X-Ninja-Region: eu

缺少任一必需 Header 将返回 401 Unauthorized

环境变量

变量

默认值

描述

MCP_HTTP_PORT

8080

监听端口

MCP_HTTP_HOST

0.0.0.0

监听主机

没有 base-URL 环境变量——base URL 根据 X-Ninja-Region 请求头按请求派生(参见 config.py 的区域表)。

MCP 端点

POST http://localhost:8080/mcp

使用以下方式连接你的 MCP 客户端:

  • 传输方式:http(Streamable HTTP)

  • 请求头:X-Ninja-Client-IdX-Ninja-Client-Secret(均必填)、X-Ninja-Region(可选)

工具列表

工具

功能

参数

ninjaone_get_organizations

列出所有客户组织

limit?, after?

ninjaone_get_organization

按 ID 查单个组织详情

organization_id(必填)

ninjaone_create_organization

创建新组织

name(必填), description?, node_approval_mode?, tags?, template_organization_id?

ninjaone_get_organization_locations

列出组织下的站点(location)

organization_id(必填)

ninjaone_get_organization_devices

列出组织下的设备

organization_id(必填), limit?, after?

ninjaone_get_devices

全局列出设备,支持 df 过滤表达式

df?, limit?, after?

ninjaone_get_device

按 ID 查单个设备详情

device_id(必填)

ninjaone_get_device_alerts

查单个设备的活跃告警

device_id(必填)

ninjaone_get_device_activities

查设备活动日志

device_id(必填), activity_type?, status?, older_than?, newer_than?, limit?

ninjaone_get_device_services

查设备的 Windows 服务列表

device_id(必填), name?, state?

ninjaone_reboot_device

重启设备(破坏性操作)

device_id(必填), mode?("NORMAL"/"FORCED",默认 NORMAL), reason?

ninjaone_get_alerts

全局列出活跃告警

source_type?, df?

ninjaone_reset_alert

重置/关闭一条告警(破坏性操作)

alert_uid(必填), activity_note?

ninjaone_get_ticket_boards

列出所有工单看板

ninjaone_get_tickets

按看板列出工单,支持状态/组织/设备过滤

board_id(必填), status?, organization_id?, device_id?, limit?, cursor?

ninjaone_create_ticket

创建新工单

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

ninjaone_update_ticket

更新工单字段和/或添加评论

ticket_id(必填), summary?, status?, priority?, assignee_id?, comment?, comment_public?

ninjaone_get_ticket_log_entries

查工单日志(描述/评论/变更历史)

ticket_id(必填), entry_type?

ninjaone_get_automation_scripts

列出可用的自动化脚本

ninjaone_get_device_scripting_options

查设备上可运行的脚本/内置动作/凭据选项

device_id(必填)

ninjaone_run_script_on_device

在设备上运行脚本或内置动作(破坏性操作)

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

ninjaone_get_active_jobs

全局列出正在运行/排队的任务

job_type?, df?

ninjaone_get_device_active_jobs

查单个设备正在运行/排队的任务

device_id(必填)

测试示例 (Test Example)

列出工单看板:

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

针对运行中的服务器执行等效的 curl(streamable HTTP MCP 端点):

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": {} }
  }'

在设备上运行脚本:

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

API 参考

  • 文档:https://app.ninjarmm.com/apidocs-beta/core-resources(eu/oc/ca/us2/fed 区域有对应版本)

  • 认证:在 POST /oauth/token 处使用 OAuth2 client_credentials 授权(grant_typeclient_idclient_secretscope),作用域:monitoringmanagementcontrol

已知差距 / 实现说明

  • 端点来源:5 个自动化/脚本/作业端点中的 4 个(requestScriptingOptionsrunScriptOnDevicegetActiveJobsgetDeviceActiveJobs)已与独立获取的 NinjaOne OpenAPI 规范副本进行了交叉核对。该副本中不存在 getAutomationScripts(它比该规范修订版更新)——其确切的 /api 路径位置是根据其他 4 个已确认的模式推断出来的,并非独立验证。请参阅 tools/automation.py 顶部的注释。

  • ninjaone_get_tickets 在客户端侧过滤:NinjaOne 的运行看板端点的请求 schema 定义了 filters/searchCriteria 参数,但社区 wyre-technology 项目报告这些参数在实践中会返回 400——此工具始终请求未过滤的页面,并在客户端侧过滤 status/organization_id/device_id

  • 没有单张工单获取或独立添加评论的端点:NinjaOne 的工单 API 不提供 GET /ticketing/ticket/{id}——要查找单张工单,需要在其看板上分页遍历 ninjaone_get_tickets。添加评论也不是独立的端点——它被合并到 ninjaone_update_ticketcomment/comment_public 参数中,同时还会对工单本身执行 PUT

  • ninjaone_get_devicesdf 过滤器在按组织限定范围时可能被 NinjaOne 静默丢弃(社区项目中的一个已知问题)——对于按组织限定的设备列表,请优先使用 ninjaone_get_organization_devices

  • 尚未使用真实凭据对真实 NinjaOne 账户进行测试——目前已验证:tools/list 返回全部 23 个工具且 schema 干净,pytest(15 个测试)通过,并且使用虚拟 client_id/secret 进行的实时调用到达了 NinjaOne 真实的生产环境 /oauth/token 端点,并收到了真实且格式正确的拒绝(Client app not exist),而不是格式错误的请求错误——这确认了基础 URL、令牌端点和请求格式都是正确的。

-
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