NinjaOne
OCI · GHCR.IO/WYRE-AI/NINJAONE-MCP
MCP server for NinjaOne RMM — devices, organizations, alerts, and tickets.
Available components
Last scanned (21 hours ago)
Scores higher than 58% of OCI servers
Category Monitoring and Observability
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. How we score → Why this is hard to score →
Supply Chain Security0
- 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.Unverified
- Known CVEs could not be checked: this artifact ships no SBOM or dependency manifest, so there is no dependency list to read.Unverified
- Install-script risk not yet assessed.Unverified
- Dependency health could not be checked: this artifact ships no SBOM or dependency manifest, so there is no dependency list to read.Unverified
Provenance & Transparency45
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Clear OSI-approved license (Apache-2.0).Pass
- Actively maintained (last published 2 days ago).Pass
- Security-disclosure policy not yet verified: we couldn't inspect the source repository.Unverified
Schema Quality & AI Usability81
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (good).Pass
- Tool/resource definitions use about 2930 tokens (~75/item across 39 items; 38 tools + 1 resources), lean.Pass
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management13
- Stability observed for 4 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage82
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 46% of tool parameters carry a description.Partial
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 38 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 39 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
- Supports UI / widget rendering.Pass
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.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 18 Oct 26 0
- Security disclosure: fail → unverified ▼ functional
- 17 Oct 26 +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.
- 15 Oct 26 +32
- Injection markers: unverified → pass ▲ security
- First check of Judged manipulation: pass security
- Tool coverage: unverified → 100 ▲ functional
- Schema quality: unverified → 100 ▲ functional
- MCP protocol: unverified → pass ▲ functional
- 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 functional
- 14 Oct 26 0
- 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). security
- Schema quality: unverified → 100 ▲ functional
- Tool coverage: unverified → 100 ▲ functional
- 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 functional
- 13 Oct 26 0
- Security disclosure: unverified → fail ▼ functional
- Package version: v2.4.0 → v2.4.1 functional
- 11 Oct 26 9
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 18 Oct 2026 · Analysed oci/ghcr.io/wyre-ai/ninjaone-mcp@v2.5.0
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | oci |
| Reason | No attestation published |
Background: How many MCP packages publish verified provenance →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
ninjaone_alerts_get ~29
Get details for a specific alert by its UID
| Name | Type | Req | Description |
|---|---|---|---|
| alert_uid | string | yes | – |
No output schema declared.
No examples provided.
ninjaone_alerts_list ~77
List active alerts, filterable by severity, organization, or device
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | – |
| device_id | number | – | – |
| limit | number | – | – |
| organization_id | number | – | – |
| severity | string | – | – |
| source_type | string | – | e.g., CONDITION, ACTIVITY |
No output schema declared.
No examples provided.
ninjaone_alerts_reset ~32
Reset (dismiss) an alert - acknowledges and marks as handled
| Name | Type | Req | Description |
|---|---|---|---|
| alert_uid | string | yes | – |
No output schema declared.
No examples provided.
ninjaone_alerts_reset_all ~48
Reset all alerts for a device or organization (destructive action)
| Name | Type | Req | Description |
|---|---|---|---|
| device_id | number | – | – |
| organization_id | number | – | – |
| severity | string | – | – |
No output schema declared.
No examples provided.
ninjaone_alerts_summary ~30
Get alert count summary grouped by severity and/or organization
| Name | Type | Req | Description |
|---|---|---|---|
| group_by | string | – | – |
No output schema declared.
No examples provided.
ninjaone_debug_elicitation_check ~52
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.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
ninjaone_devices_activities ~39
Get device activity log
| Name | Type | Req | Description |
|---|---|---|---|
| activity_type | string | – | – |
| device_id | number | yes | – |
| limit | number | – | – |
No output schema declared.
No examples provided.
ninjaone_devices_alerts ~33
Get active alerts for a device
| Name | Type | Req | Description |
|---|---|---|---|
| device_id | number | yes | – |
| severity | string | – | – |
No output schema declared.
No examples provided.
ninjaone_devices_get ~24
Get device details by ID
| Name | Type | Req | Description |
|---|---|---|---|
| device_id | number | yes | – |
No output schema declared.
No examples provided.
ninjaone_devices_get_custom_fields ~25
Get device custom fields
| Name | Type | Req | Description |
|---|---|---|---|
| device_id | number | yes | – |
No output schema declared.
No examples provided.
ninjaone_devices_list ~132
List NinjaOne devices, filterable by organization, device class, or online status
| Name | Type | Req | Description |
|---|---|---|---|
| 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 | – | – |
No output schema declared.
No examples provided.
ninjaone_devices_reboot ~34
Schedule device reboot (destructive action)
| Name | Type | Req | Description |
|---|---|---|---|
| device_id | number | yes | – |
| reason | string | – | – |
No output schema declared.
No examples provided.
ninjaone_devices_services ~32
List Windows services on a device
| Name | Type | Req | Description |
|---|---|---|---|
| device_id | number | yes | – |
| state | string | – | – |
No output schema declared.
No examples provided.
ninjaone_devices_update_custom_fields ~39
Update device custom fields
| Name | Type | Req | Description |
|---|---|---|---|
| device_id | number | yes | – |
| fields | object | yes | Custom field name/value pairs to set |
No output schema declared.
No examples provided.
ninjaone_navigate ~166
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.
| Name | Type | Req | Description |
|---|---|---|---|
| domain | string | yes | The domain to explore: - devices: Device management - manage endpoints, reboot systems, view services, and get device alerts/activities - organizations: Organization management - manage customer acco… |
No output schema declared.
No examples provided.
ninjaone_organizations_create ~53
Create new organization
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | – | – |
| name | string | yes | – |
| node_approval_mode | string | – | How to handle new device registrations |
| policy_id | number | – | – |
No output schema declared.
No examples provided.
ninjaone_organizations_devices ~237
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 | yes | – |
No output schema declared.
No examples provided.
ninjaone_organizations_get ~25
Get organization details by ID
| Name | Type | Req | Description |
|---|---|---|---|
| organization_id | number | yes | – |
No output schema declared.
No examples provided.
ninjaone_organizations_get_custom_fields ~26
Get organization custom fields
| Name | Type | Req | Description |
|---|---|---|---|
| organization_id | number | yes | – |
No output schema declared.
No examples provided.
ninjaone_organizations_list ~31
List organizations (customer accounts)
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | – |
| limit | number | – | – |
No output schema declared.
No examples provided.
ninjaone_organizations_locations ~23
List organization locations
| Name | Type | Req | Description |
|---|---|---|---|
| organization_id | number | yes | – |
No output schema declared.
No examples provided.
ninjaone_organizations_update_custom_fields ~40
Update organization custom fields
| Name | Type | Req | Description |
|---|---|---|---|
| fields | object | yes | Custom field name/value pairs to set |
| organization_id | number | yes | – |
No output schema declared.
No examples provided.
ninjaone_scripts_list ~53
List scripts and built-in actions available to run on a device, and the credential roles eligible to run as
| Name | Type | Req | Description |
|---|---|---|---|
| device_id | number | yes | – |
| lang | string | – | Language for localized script/action names |
No output schema declared.
No examples provided.
ninjaone_scripts_run ~237
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 | yes | – |
| 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 | yes | 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 |
No output schema declared.
No examples provided.
ninjaone_status ~18
Show API credential status and available tool domains
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
ninjaone_tickets_add_comment ~46
Add comment to ticket
| Name | Type | Req | Description |
|---|---|---|---|
| body | string | yes | – |
| public | boolean | – | visible to customers (default: true) |
| ticket_id | number | yes | – |
No output schema declared.
No examples provided.
ninjaone_tickets_attributes_list ~41
List ticket attribute (custom field) definitions and their IDs, for the attributes argument of ninjaone_tickets_create and ninjaone_tickets_update.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
ninjaone_tickets_boards_list ~35
List available ticket boards for the tenant. Use this to discover board_id values for ninjaone_tickets_list.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
ninjaone_tickets_comments ~62
Get a ticket's log entries (comments and activity). Pass type to narrow the feed, e.g. type=COMMENT for just the conversation.
| Name | Type | Req | Description |
|---|---|---|---|
| ticket_id | number | yes | – |
| type | string | – | Return only log entries of this type. |
No output schema declared.
No examples provided.
ninjaone_tickets_contacts_list ~29
List ticketing contacts. Each carries the uid used as a ticket's requester_uid.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
ninjaone_tickets_create ~325
Create a new ticket. NinjaOne requires a ticket form, so call ninjaone_tickets_forms_list first and pass its id as ticket_form_id.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 | yes | 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 | yes | Ticket subject (max 200 characters). |
| tags | array | – | – |
| ticket_form_id | number | yes | Ticket form to create against. Required by NinjaOne — discover IDs with ninjaone_tickets_forms_list. |
| type | string | – | – |
No output schema declared.
No examples provided.
ninjaone_tickets_form_get ~30
Get one ticket form, including its field definitions.
| Name | Type | Req | Description |
|---|---|---|---|
| form_id | number | yes | – |
No output schema declared.
No examples provided.
ninjaone_tickets_forms_list ~43
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.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
ninjaone_tickets_get ~25
Get ticket details by ID
| Name | Type | Req | Description |
|---|---|---|---|
| ticket_id | number | yes | – |
No output schema declared.
No examples provided.
ninjaone_tickets_list ~311
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.
| Name | Type | Req | Description |
|---|---|---|---|
| board_id | number | yes | 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. |
No output schema declared.
No examples provided.
ninjaone_tickets_statuses_list ~44
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.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
ninjaone_tickets_update ~265
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 | yes | – |
| type | string | – | – |
| version | number | – | Ticket version from ninjaone_tickets_get, for optimistic locking. |
No output schema declared.
No examples provided.
ninjaone_tickets_users_list ~122
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 | – | – |
No output schema declared.
No examples provided.
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.
oci · ghcr.io/wyre-ai/ninjaone-mcp
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.
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.