# NinjaOne (oci · ghcr.io/wyre-ai/ninjaone-mcp)

MCP server for NinjaOne RMM — devices, organizations, alerts, and tickets.

- Trust score: 42/100 (low)
- Change this week: +33
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-18

## Components

- oci · `ghcr.io/wyre-ai/ninjaone-mcp`: 42/100 (this document), [markdown](https://verifymcp.io/servers/wyre-ai-ninjaone-mcp/ghcr-io-wyre-ai-ninjaone-mcp.md), [page](https://verifymcp.io/servers/wyre-ai-ninjaone-mcp/ghcr-io-wyre-ai-ninjaone-mcp)

## Channel facts

- Registry: `oci`
- Package: `ghcr.io/wyre-ai/ninjaone-mcp`
- Version: `v2.5.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-18.

- **Supply Chain Security**: 0/100
  - No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.
  - Known CVEs could not be checked: this artifact ships no SBOM or dependency manifest, so there is no dependency list to read.
  - Install-script risk not yet assessed.
  - Dependency health could not be checked: this artifact ships no SBOM or dependency manifest, so there is no dependency list to read.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (Apache-2.0).
  - Actively maintained (last published 2 days ago).
  - Security-disclosure policy not yet verified: we couldn't inspect the source repository.
- **Schema Quality & AI Usability**: 81/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Tool/resource definitions use about 2930 tokens (~75/item across 39 items; 38 tools + 1 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 13/100
  - Stability observed for 4 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 82/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 46% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 38 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 39 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).
  - Supports UI / widget rendering.

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the NinjaOne MCP server?

NinjaOne runs locally as a container image, launched with docker run --rm -i -e NINJAONE_CLIENT_ID -e NINJAONE_CLIENT_SECRET -e NINJAONE_REGION -e MCP_TRANSPORT -e AUTH_MODE -e LOG_LEVEL ghcr.io/wyre-ai/ninjaone-mcp:v2.5.0. Ready-made configuration for Claude, Cursor, VS Code, Codex and 3 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add wyre-ai-ninjaone-mcp -- docker run --rm -i -e NINJAONE_CLIENT_ID -e NINJAONE_CLIENT_SECRET -e NINJAONE_REGION -e MCP_TRANSPORT -e AUTH_MODE -e LOG_LEVEL ghcr.io/wyre-ai/ninjaone-mcp:v2.5.0
```

This image reads NINJAONE_CLIENT_ID, NINJAONE_CLIENT_SECRET, NINJAONE_REGION, MCP_TRANSPORT, AUTH_MODE and LOG_LEVEL. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Cursor

```json
{
  "mcpServers": {
    "wyre-ai-ninjaone-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "NINJAONE_CLIENT_ID",
        "-e",
        "NINJAONE_CLIENT_SECRET",
        "-e",
        "NINJAONE_REGION",
        "-e",
        "MCP_TRANSPORT",
        "-e",
        "AUTH_MODE",
        "-e",
        "LOG_LEVEL",
        "ghcr.io/wyre-ai/ninjaone-mcp:v2.5.0"
      ]
    }
  }
}
```

This image reads NINJAONE_CLIENT_ID, NINJAONE_CLIENT_SECRET, NINJAONE_REGION, MCP_TRANSPORT, AUTH_MODE and LOG_LEVEL. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### VS Code

```json
{
  "servers": {
    "wyre-ai-ninjaone-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "NINJAONE_CLIENT_ID",
        "-e",
        "NINJAONE_CLIENT_SECRET",
        "-e",
        "NINJAONE_REGION",
        "-e",
        "MCP_TRANSPORT",
        "-e",
        "AUTH_MODE",
        "-e",
        "LOG_LEVEL",
        "ghcr.io/wyre-ai/ninjaone-mcp:v2.5.0"
      ]
    }
  }
}
```

This image reads NINJAONE_CLIENT_ID, NINJAONE_CLIENT_SECRET, NINJAONE_REGION, MCP_TRANSPORT, AUTH_MODE and LOG_LEVEL. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Codex

```bash
codex mcp add wyre-ai-ninjaone-mcp -- docker run --rm -i -e NINJAONE_CLIENT_ID -e NINJAONE_CLIENT_SECRET -e NINJAONE_REGION -e MCP_TRANSPORT -e AUTH_MODE -e LOG_LEVEL ghcr.io/wyre-ai/ninjaone-mcp:v2.5.0
```

This image reads NINJAONE_CLIENT_ID, NINJAONE_CLIENT_SECRET, NINJAONE_REGION, MCP_TRANSPORT, AUTH_MODE and LOG_LEVEL. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "wyre-ai-ninjaone-mcp": {
      "type": "local",
      "command": [
        "docker",
        "run",
        "--rm",
        "-i",
        "-e",
        "NINJAONE_CLIENT_ID",
        "-e",
        "NINJAONE_CLIENT_SECRET",
        "-e",
        "NINJAONE_REGION",
        "-e",
        "MCP_TRANSPORT",
        "-e",
        "AUTH_MODE",
        "-e",
        "LOG_LEVEL",
        "ghcr.io/wyre-ai/ninjaone-mcp:v2.5.0"
      ],
      "enabled": true
    }
  }
}
```

This image reads NINJAONE_CLIENT_ID, NINJAONE_CLIENT_SECRET, NINJAONE_REGION, MCP_TRANSPORT, AUTH_MODE and LOG_LEVEL. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Hermes

```yaml
mcp_servers:
  wyre-ai-ninjaone-mcp:
    command: "docker"
    args: ["run", "--rm", "-i", "-e", "NINJAONE_CLIENT_ID", "-e", "NINJAONE_CLIENT_SECRET", "-e", "NINJAONE_REGION", "-e", "MCP_TRANSPORT", "-e", "AUTH_MODE", "-e", "LOG_LEVEL", "ghcr.io/wyre-ai/ninjaone-mcp:v2.5.0"]
```

This image reads NINJAONE_CLIENT_ID, NINJAONE_CLIENT_SECRET, NINJAONE_REGION, MCP_TRANSPORT, AUTH_MODE and LOG_LEVEL. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Netclaw

```json
{
  "McpServers": {
    "wyre-ai-ninjaone-mcp": {
      "Transport": "stdio",
      "Command": "docker",
      "Arguments": [
        "run",
        "--rm",
        "-i",
        "-e",
        "NINJAONE_CLIENT_ID",
        "-e",
        "NINJAONE_CLIENT_SECRET",
        "-e",
        "NINJAONE_REGION",
        "-e",
        "MCP_TRANSPORT",
        "-e",
        "AUTH_MODE",
        "-e",
        "LOG_LEVEL",
        "ghcr.io/wyre-ai/ninjaone-mcp:v2.5.0"
      ]
    }
  }
}
```

This image reads NINJAONE_CLIENT_ID, NINJAONE_CLIENT_SECRET, NINJAONE_REGION, MCP_TRANSPORT, AUTH_MODE and LOG_LEVEL. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Other

```json
{
  "mcpServers": {
    "wyre-ai-ninjaone-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "NINJAONE_CLIENT_ID",
        "-e",
        "NINJAONE_CLIENT_SECRET",
        "-e",
        "NINJAONE_REGION",
        "-e",
        "MCP_TRANSPORT",
        "-e",
        "AUTH_MODE",
        "-e",
        "LOG_LEVEL",
        "ghcr.io/wyre-ai/ninjaone-mcp:v2.5.0"
      ]
    }
  }
}
```

This image reads NINJAONE_CLIENT_ID, NINJAONE_CLIENT_SECRET, NINJAONE_REGION, MCP_TRANSPORT, AUTH_MODE and LOG_LEVEL. Set them in your client's env block for this server; docker run -e passes each one through to the container.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-18 (score 42, 0)

- [functional regression] Security disclosure: fail → unverified

### 2026-10-17 (score 42, +1)

No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-15 (score 41, +32)

- [security improvement] Injection markers: unverified → pass
- [security] First check of Judged manipulation: pass
- [functional improvement] Tool coverage: unverified → 100
- [functional improvement] Schema quality: unverified → 100
- [functional improvement] MCP protocol: unverified → pass
- [functional improvement] Stability: unverified → 0.03
- [functional] First check of Schema quality: fail
- [functional] First check of Tool coverage: 46
- [functional] First check of Capabilities: pass
- [functional] First check of Schema quality: pass
- [functional] First check of Schema quality: good
- [functional] First check of Destructive annotations: pass
- [functional] Package version: v2.4.2 → v2.5.0

### 2026-10-14 (score 9, 0)

- [security improvement] Injection markers: unverified → pass
- [security] First check of Judged manipulation: pass
- [security] Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window).
- [functional improvement] Schema quality: unverified → 100
- [functional improvement] Tool coverage: unverified → 100
- [functional improvement] MCP protocol: unverified → pass
- [functional] First check of Schema quality: fail
- [functional] First check of Destructive annotations: pass
- [functional] First check of Tool coverage: 43
- [functional] First check of Capabilities: pass
- [functional] First check of Schema quality: pass
- [functional] First check of Schema quality: good
- [functional] Package version: v2.4.1 → v2.4.2

### 2026-10-13 (score 9, 0)

- [functional regression] Security disclosure: unverified → fail
- [functional] Package version: v2.4.0 → v2.4.1

### 2026-10-11 (score 9)

First indexed and scored.

## MCP tools (38)

### `ninjaone_navigate` (~166 tokens)

Discover available NinjaOne tools by domain. Returns tool names and descriptions for the selected domain. All tools are callable at any time — this is a help/discovery aid, not a prerequisite.

Input parameters:

- `domain` (string, required): The domain to explore: - devices: Device management - manage endpoints, reboot systems, view services, and get device alerts/activities - organizations: Organization management - manage customer acco…

### `ninjaone_status` (~18 tokens)

Show API credential status and available tool domains

### `ninjaone_debug_elicitation_check` (~52 tokens)

TEMPORARY diagnostic for the ninjaone_scripts_run launch smoke test -- remove after use. Issues a server-initiated confirmation prompt and reports exactly what the connected client returned. No side effects.

### `ninjaone_devices_list` (~132 tokens)

List NinjaOne devices, filterable by organization, device class, or online status

Input parameters:

- `cursor` (string): Pagination cursor from a previous response's cursor field (the last device id).
- `device_class` (string): NinjaOne node class (for example WINDOWS_SERVER, LINUX_WORKSTATION, NMS_SWITCH). LINUX, VMWARE_VM, and NMS are not valid classes.
- `limit` (number): Max devices to return (default 50). A full page sets hasMore=true and returns a cursor.
- `online` (boolean)
- `organization_id` (number)

### `ninjaone_devices_get` (~24 tokens)

Get device details by ID

Input parameters:

- `device_id` (number, required)

### `ninjaone_devices_reboot` (~34 tokens)

Schedule device reboot (destructive action)

Input parameters:

- `device_id` (number, required)
- `reason` (string)

### `ninjaone_devices_services` (~32 tokens)

List Windows services on a device

Input parameters:

- `device_id` (number, required)
- `state` (string)

### `ninjaone_devices_alerts` (~33 tokens)

Get active alerts for a device

Input parameters:

- `device_id` (number, required)
- `severity` (string)

### `ninjaone_devices_activities` (~39 tokens)

Get device activity log

Input parameters:

- `activity_type` (string)
- `device_id` (number, required)
- `limit` (number)

### `ninjaone_devices_get_custom_fields` (~25 tokens)

Get device custom fields

Input parameters:

- `device_id` (number, required)

### `ninjaone_devices_update_custom_fields` (~39 tokens)

Update device custom fields

Input parameters:

- `device_id` (number, required)
- `fields` (object, required): Custom field name/value pairs to set

### `ninjaone_organizations_list` (~31 tokens)

List organizations (customer accounts)

Input parameters:

- `cursor` (string)
- `limit` (number)

### `ninjaone_organizations_get` (~25 tokens)

Get organization details by ID

Input parameters:

- `organization_id` (number, required)

### `ninjaone_organizations_create` (~53 tokens)

Create new organization

Input parameters:

- `description` (string)
- `name` (string, required)
- `node_approval_mode` (string): How to handle new device registrations
- `policy_id` (number)

### `ninjaone_organizations_locations` (~23 tokens)

List organization locations

Input parameters:

- `organization_id` (number, required)

### `ninjaone_organizations_devices` (~237 tokens)

List devices for one organization. device_class is sent upstream as df=class=<NodeClass> (the filter GET /v2/devices actually applies; a named nodeClass parameter is ignored) and the page is filtered again so a dropped df cannot return other classes. online is sent as the df online/offline predicate and applied to the page. A full page sets hasMore=true and returns a cursor (the last device id on that page). count is matches in this page, not an organization-wide total.

Input parameters:

- `cursor` (string): Pagination cursor from a previous response's cursor field (the last device id).
- `device_class` (string): NinjaOne node class (for example WINDOWS_SERVER, LINUX_WORKSTATION, NMS_SWITCH). LINUX, VMWARE_VM, and NMS are not valid classes.
- `limit` (number): Max devices to fetch (default 50). A full page sets hasMore=true and returns a cursor.
- `online` (boolean): When set, keep only online (true) or offline (false) devices in this page.
- `organization_id` (number, required)

### `ninjaone_organizations_get_custom_fields` (~26 tokens)

Get organization custom fields

Input parameters:

- `organization_id` (number, required)

### `ninjaone_organizations_update_custom_fields` (~40 tokens)

Update organization custom fields

Input parameters:

- `fields` (object, required): Custom field name/value pairs to set
- `organization_id` (number, required)

### `ninjaone_alerts_list` (~77 tokens)

List active alerts, filterable by severity, organization, or device

Input parameters:

- `cursor` (string)
- `device_id` (number)
- `limit` (number)
- `organization_id` (number)
- `severity` (string)
- `source_type` (string): e.g., CONDITION, ACTIVITY

### `ninjaone_alerts_get` (~29 tokens)

Get details for a specific alert by its UID

Input parameters:

- `alert_uid` (string, required)

### `ninjaone_alerts_reset` (~32 tokens)

Reset (dismiss) an alert - acknowledges and marks as handled

Input parameters:

- `alert_uid` (string, required)

### `ninjaone_alerts_reset_all` (~48 tokens)

Reset all alerts for a device or organization (destructive action)

Input parameters:

- `device_id` (number)
- `organization_id` (number)
- `severity` (string)

### `ninjaone_alerts_summary` (~30 tokens)

Get alert count summary grouped by severity and/or organization

Input parameters:

- `group_by` (string)

### `ninjaone_tickets_list` (~311 tokens)

List tickets from a ticket board, filterable by status, organization, or device. Requires board_id: NinjaOne queries tickets per board and board IDs vary by tenant (board 1 is NOT always the 'All Tickets' board). Discover board IDs with ninjaone_tickets_boards_list first. NOTE: status/organization/device filters are applied client-side within one board page (NinjaOne's board API cannot filter by them server-side), so the response reports `count` (matches in this page) separately from `scanned`, plus `hasMore`/`cursor` — page through until hasMore is false to get every match; never treat one page's count as a board-wide total.

Input parameters:

- `board_id` (number, required): Ticket board to query. Use ninjaone_tickets_boards_list to discover valid IDs.
- `cursor` (string): Pagination cursor from a previous response's cursor field (the board's lastCursorId).
- `device_id` (number): Filter by linked device (ticket nodeId), matched client-side.
- `limit` (number): Board page size (default 50). A full page sets hasMore=true and returns a cursor.
- `organization_id` (number): Filter by organization (ticket clientId), matched client-side.
- `status` (string): Filter by status, matched client-side against each ticket's status display name. Statuses are configured per tenant — use ninjaone_tickets_statuses_list to see the real names rather than guessing.

### `ninjaone_tickets_get` (~25 tokens)

Get ticket details by ID

Input parameters:

- `ticket_id` (number, required)

### `ninjaone_tickets_create` (~325 tokens)

Create a new ticket. NinjaOne requires a ticket form, so call ninjaone_tickets_forms_list first and pass its id as ticket_form_id.

Input parameters:

- `assignee_id` (number): Technician to assign (sent as assignedAppUserId). Discover with ninjaone_tickets_users_list.
- `attributes` (array): Custom field values. Discover attribute IDs with ninjaone_tickets_attributes_list.
- `description` (string): Initial description, stored as the ticket's first log entry. Set description_public=false to keep it internal.
- `description_public` (boolean): Whether the description is visible to the requester (default: true).
- `device_id` (number): Link the ticket to a device (sent as nodeId).
- `location_id` (number)
- `organization_id` (number, required): Organization the ticket belongs to (sent as clientId).
- `priority` (string): Ticket priority. CRITICAL is a severity, not a priority.
- `requester_uid` (string): UUID of the requesting contact. Discover with ninjaone_tickets_contacts_list.
- `severity` (string)
- `status` (string): Status ID to open the ticket in. Statuses are per-tenant — use ninjaone_tickets_statuses_list. Defaults to 1000 (New).
- `subject` (string, required): Ticket subject (max 200 characters).
- `tags` (array)
- `ticket_form_id` (number, required): Ticket form to create against. Required by NinjaOne — discover IDs with ninjaone_tickets_forms_list.
- `type` (string)

### `ninjaone_tickets_update` (~265 tokens)

Update an existing ticket's fields. NinjaOne's ticket PUT is a full replace and may reject a partial body — if it does, read the ticket with ninjaone_tickets_get and resend its subject, status, organization_id, ticket_form_id, requester_uid and version alongside your changes. It does not accept comments: use ninjaone_tickets_add_comment for those.

Input parameters:

- `assignee_id` (number): Technician to assign (sent as assignedAppUserId). Discover with ninjaone_tickets_users_list.
- `attributes` (array)
- `location_id` (number)
- `organization_id` (number): Sent as clientId; required when NinjaOne rejects a partial update.
- `priority` (string): Ticket priority. CRITICAL is a severity, not a priority.
- `requester_uid` (string)
- `severity` (string)
- `status` (string): Status ID. Statuses are per-tenant — use ninjaone_tickets_statuses_list.
- `subject` (string)
- `tags` (array)
- `ticket_form_id` (number)
- `ticket_id` (number, required)
- `type` (string)
- `version` (number): Ticket version from ninjaone_tickets_get, for optimistic locking.

### `ninjaone_tickets_add_comment` (~46 tokens)

Add comment to ticket

Input parameters:

- `body` (string, required)
- `public` (boolean): visible to customers (default: true)
- `ticket_id` (number, required)

### `ninjaone_tickets_comments` (~62 tokens)

Get a ticket's log entries (comments and activity). Pass type to narrow the feed, e.g. type=COMMENT for just the conversation.

Input parameters:

- `ticket_id` (number, required)
- `type` (string): Return only log entries of this type.

### `ninjaone_tickets_boards_list` (~35 tokens)

List available ticket boards for the tenant. Use this to discover board_id values for ninjaone_tickets_list.

### `ninjaone_tickets_forms_list` (~43 tokens)

List ticket forms with their fields. Every ticket is created against a form, so use this to find the ticket_form_id for ninjaone_tickets_create.

### `ninjaone_tickets_form_get` (~30 tokens)

Get one ticket form, including its field definitions.

Input parameters:

- `form_id` (number, required)

### `ninjaone_tickets_statuses_list` (~44 tokens)

List the tenant's configured ticket statuses with their IDs. Statuses are per-tenant, so read them here rather than assuming names like OPEN or CLOSED.

### `ninjaone_tickets_attributes_list` (~41 tokens)

List ticket attribute (custom field) definitions and their IDs, for the attributes argument of ninjaone_tickets_create and ninjaone_tickets_update.

### `ninjaone_tickets_contacts_list` (~29 tokens)

List ticketing contacts. Each carries the uid used as a ticket's requester_uid.

### `ninjaone_tickets_users_list` (~122 tokens)

List ticketing users — technicians, end users and contacts. Use this to find the assignee_id (a technician's numeric id) for ninjaone_tickets_create/update.

Input parameters:

- `cursor` (number): anchorNaturalId of the last user from the previous page.
- `limit` (number): Records per page (default 50).
- `organization_id` (number): Restrict to one organization (sent as clientId).
- `search` (string): Match on first name, last name or email address.
- `user_type` (string)

### `ninjaone_scripts_list` (~53 tokens)

List scripts and built-in actions available to run on a device, and the credential roles eligible to run as

Input parameters:

- `device_id` (number, required)
- `lang` (string): Language for localized script/action names

### `ninjaone_scripts_run` (~237 tokens)

Run an org-approved script or built-in action on a device (destructive action -- executes code on the customer endpoint). Only scripts the org has pre-approved can run; everything else is refused regardless of this tool's arguments. On HTTP, the caller must already be authenticated (gateway per-request credentials, or a gateway-signed request plus NINJAONE_ALLOW_SERVER_HELD_SCRIPT_EXECUTION for server-held credentials). Confirming the prompt does not authorize the run.

Input parameters:

- `confirm` (boolean): Set true only after you have confirmed with the end user that this script should run on this device. Required when the connected client does not support interactive confirmation prompts.
- `device_id` (number, required)
- `id` (number): Script identifier -- required when type is SCRIPT
- `parameters` (string): Parameters passed to the script/action
- `run_as` (string): Credential role/identifier to run as
- `type` (string, required): SCRIPT = a custom script (use id); ACTION = a built-in action (use uid)
- `uid` (string): Built-in action identifier (uuid) -- required when type is ACTION

## Diagnostics

Captured diagnostic sections: Provenance. The full working is on the page: https://verifymcp.io/servers/wyre-ai-ninjaone-mcp/ghcr-io-wyre-ai-ninjaone-mcp#diagnostics

## Score history

- 2026-10-18: 42
- 2026-10-17: 42
- 2026-10-16: 41
- 2026-10-15: 41
- 2026-10-14: 9
- 2026-10-13: 9
- 2026-10-12: 9
- 2026-10-11: 9

## Common questions

### What is the NinjaOne MCP server?

NinjaOne is an MCP server listed in the public MCP registry as io.github.WYRE-AI/ninjaone-mcp. MCP server for NinjaOne RMM, devices, organizations, alerts, and tickets. This page covers its container image (ghcr.io/wyre-ai/ninjaone-mcp).

### Is the NinjaOne MCP server safe to use?

NinjaOne scores 42 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the NinjaOne MCP server expose?

NinjaOne exposes 38 tools: ninjaone_navigate, ninjaone_status, ninjaone_debug_elicitation_check, ninjaone_devices_list, ninjaone_devices_get, and 33 more. Their descriptions and schemas cost roughly 2,913 tokens of context every time the server is loaded.

### Is the NinjaOne MCP server still maintained?

NinjaOne is still listed as active in the MCP registry. We last reached this channel on 18 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the NinjaOne MCP server under?

NinjaOne declares the Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- GitHub Container Registry: https://ghcr.io/wyre-ai/ninjaone-mcp
- Repository: https://github.com/WYRE-AI/ninjaone-mcp
- Changelog RSS feed: https://verifymcp.io/servers/wyre-ai-ninjaone-mcp/ghcr-io-wyre-ai-ninjaone-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/wyre-ai-ninjaone-mcp/ghcr-io-wyre-ai-ninjaone-mcp.json
- HTML version of this page: https://verifymcp.io/servers/wyre-ai-ninjaone-mcp/ghcr-io-wyre-ai-ninjaone-mcp
