oci ghcr.io/wyre-technology/ninjaone-mcp:v2.2.9stdioApache-2.0updated 8d ago
A Model Context Protocol (MCP) server for interacting with NinjaOne, featuring a decision tree architecture for efficient tool loading.
What can you do with NinjaOne?
NinjaOne MCP Server
A Model Context Protocol (MCP) server for interacting with NinjaOne, featuring a decision tree architecture for efficient tool loading.
One-Click Deployment
[!IMPORTANT] Before you click: this server depends on
@wyre-ai/node-ninjaone, which is hosted on the GitHub Packages npm registry. GitHub Packages has no anonymous access — even though the package is public, everynpm installneeds a token. The cloud builder runsnpm installfor you, so you must give it one, or the build fails withnpm error 401 Unauthorized ... npm.pkg.github.com.
- Create a GitHub Personal Access Token with the
read:packagesscope (classic token). Any GitHub account works — you do not need to be a member of thewyre-aiorg to read its public packages.- Add it as a build variable when prompted by the deploy flow:
- Cloudflare Workers → set a build variable named
NODE_AUTH_TOKENto your PAT (Workers → Settings → Build → Variables and Secrets).- DigitalOcean App Platform → set an encrypted env var named
GITHUB_TOKENwith scope Build Time to your PAT (the.do/app.yamlalready declares it).
[!NOTE] Both targets run the full MCP server. DigitalOcean builds the Docker image and serves it over HTTP; Cloudflare Workers serves the same server via the SDK's Web Standard Streamable HTTP transport (
src/worker.ts). After deploying, set your NinjaOne credentials as secrets —NINJAONE_CLIENT_ID,NINJAONE_CLIENT_SECRET, and optionallyNINJAONE_REGION— or setAUTH_MODE=gatewayto take credentials per-request fromX-Ninja-*headers. The MCP endpoint is/mcp;/healthis an unauthenticated liveness probe.
Architecture
This MCP server uses a hierarchical tool loading approach instead of exposing all tools upfront:
- Navigation Phase: Initially exposes only a navigation tool (
ninjaone_navigate) - Domain Selection: User selects a domain (devices, organizations, alerts, tickets)
- Domain Tools: Server exposes domain-specific tools after selection
- Lazy Loading: Domain handlers and the NinjaOne client are loaded on-demand
This architecture provides:
- Reduced cognitive load (fewer tools to choose from)
- Faster initial load times
- Better organization of related operations
- Clear navigation state
Installation
This package is published to the GitHub Packages npm registry, which requires a token even for public packages. Authenticate once, then install:
# Authenticate npm to GitHub Packages (token needs the read:packages scope)
export NODE_AUTH_TOKEN=$(gh auth token) # or a PAT with read:packages
npm install @wyre-ai/ninjaone-mcp
The repo's .npmrc already points the @wyre-ai scope at GitHub Packages and
reads the token from NODE_AUTH_TOKEN, so no further config is needed. The same applies
to npx @wyre-ai/ninjaone-mcp below. Prefer a zero-setup option? Use the prebuilt
container image (ghcr.io/wyre-ai/ninjaone-mcp) or the .mcpb bundle attached to
each release.
Configuration
Set the following environment variables:
| Variable | Required | Description |
|---|---|---|
NINJAONE_CLIENT_ID |
Yes | OAuth 2.0 Client ID |
NINJAONE_CLIENT_SECRET |
Yes | OAuth 2.0 Client Secret |
NINJAONE_REGION |
No | Region: us (default), eu, oc, ca, us2, or fed |
NINJAONE_SCOPES |
No | OAuth scopes to request. Defaults to monitoring,management. Set this if your API app is granted a narrower set — see OAuth scopes |
NinjaOne API Regions
| Region | Base URL |
|---|---|
us |
https://app.ninjarmm.com |
eu |
https://eu.ninjarmm.com |
oc |
https://oc.ninjarmm.com |
ca |
https://ca.ninjarmm.com |
us2 |
https://us2.ninjarmm.com |
fed |
https://fed.ninjarmm.com |
Usage
Running Standalone
# Set credentials
export NINJAONE_CLIENT_ID="your-client-id"
export NINJAONE_CLIENT_SECRET="your-client-secret"
export NINJAONE_REGION="us"
# Run the server
npx @wyre-ai/ninjaone-mcp
Claude Desktop Configuration
Add to your Claude Desktop claude_desktop_config.json:
{
"mcpServers": {
"ninjaone": {
"command": "npx",
"args": ["@wyre-ai/ninjaone-mcp"],
"env": {
"NINJAONE_CLIENT_ID": "your-client-id",
"NINJAONE_CLIENT_SECRET": "your-client-secret",
"NINJAONE_REGION": "us"
}
}
}
}
Docker
docker build -t ninjaone-mcp .
docker run -e NINJAONE_CLIENT_ID=xxx -e NINJAONE_CLIENT_SECRET=xxx -e NINJAONE_REGION=us ninjaone-mcp
Available Domains
Devices
Manage endpoints, reboot devices, view services and alerts.
Tools:
ninjaone_devices_list- List devices, filterable by organization, device class, and online status. Paginated: a full page returnshasMore: trueand acursorto pass back for the next page.ninjaone_devices_get- Get device detailsninjaone_devices_reboot- Schedule a device rebootninjaone_devices_services- List Windows services on a deviceninjaone_devices_alerts- Get device-specific alertsninjaone_devices_activities- View device activity logninjaone_devices_get_custom_fields- Get device custom fieldsninjaone_devices_update_custom_fields- Update device custom fields
Organizations
Manage customer organizations and their resources.
Tools:
ninjaone_organizations_list- List organizationsninjaone_organizations_get- Get organization detailsninjaone_organizations_create- Create a new organizationninjaone_organizations_locations- List organization locationsninjaone_organizations_devices- List devices for an organizationninjaone_organizations_get_custom_fields- Get organization custom fieldsninjaone_organizations_update_custom_fields- Update organization custom fields
Alerts
View and manage alerts across all devices.
Tools:
ninjaone_alerts_list- List alerts with filtersninjaone_alerts_get- Get a single alert by UID (renders as an interactive card in MCP Apps hosts)ninjaone_alerts_reset- Reset/dismiss a single alertninjaone_alerts_reset_all- Reset all alerts for a device or organizationninjaone_alerts_summary- Get alert count summary
Features:
- Interactive Alert Card (MCP Apps, SEP-1865):
ninjaone_alerts_getrenders as an interactive card in MCP Apps hosts (Claude Desktop/web) with an in-card "Reset alert" round-trip vianinjaone_alerts_reset; neutral by default, brandable viawindow.__BRAND__injection orMCP_BRAND_*env vars; plain-JSON behavior is unchanged in other hosts
Tickets
Manage service tickets.
Tools:
ninjaone_tickets_list- List tickets from a board (requiresboard_id;status/organization_id/device_idfilters are applied client-side, see notes below)ninjaone_tickets_get- Get ticket detailsninjaone_tickets_create- Create a new ticketninjaone_tickets_update- Update an existing ticketninjaone_tickets_add_comment- Add a comment to a ticketninjaone_tickets_comments- Get ticket commentsninjaone_tickets_boards_list- List ticket boards (to discoverboard_idvalues)
Note: NinjaOne queries tickets per board, and board IDs vary by tenant — board 1 is not always the "All Tickets" board, so
ninjaone_tickets_listrequires an explicitboard_idrather than silently guessing one. Discover IDs withninjaone_tickets_boards_list; on tenants where that endpoint returns 404, read the numeric ID from the board link's URL in the NinjaOne web UI (e.g. the "All tickets" sidebar link).Note: NinjaOne's board-run API cannot filter tickets by status, organization, or device server-side (attempting to throws a generic
Bad request).ninjaone_tickets_listtherefore applies those filters client-side within one board page. The response separatescount(matches in this page) fromscanned(tickets examined) and includeshasMore/cursor— page through untilhasMoreisfalseto get every match, and never treat a single page'scountas a board-wide total. Status is matched against each ticket's status display name, so custom board statuses may not map to theOPEN/IN_PROGRESS/WAITING/CLOSEDvalues.Similarly,
ninjaone_devices_listfilters byorganization_idthrough NinjaOne's dedicated per-organization endpoint (the generaldf=orgdevice filter is unreliable and can silently return the full fleet).
Navigation Tools
Always available:
ninjaone_navigate- Select a domain to work withninjaone_status- Show current state and credential statusninjaone_back- Return to main menu (when in a domain)
Example Workflow
User: Check my devices
Claude: [calls ninjaone_navigate with domain="devices"]
-> Navigated to devices domain. Available tools: ...
User: List all Windows servers
Claude: [calls ninjaone_devices_list with device_class="WINDOWS_SERVER"]
-> [device list results]
User: Now show me alerts
Claude: [calls ninjaone_back]
-> Navigated back to main menu.
[calls ninjaone_navigate with domain="alerts"]
-> Navigated to alerts domain.
Authentication
NinjaOne uses OAuth 2.0 for authentication. You need to:
- Log in to your NinjaOne dashboard
- Go to Administration > Apps > API
- Create a new API application (application platform: API Services, grant type Client Credentials)
- Grant it the scopes you need — see below
- Note the Client ID and Client Secret
- Configure the environment variables
The client library handles token refresh automatically.
OAuth scopes
By default the server requests monitoring management. Which scopes you actually
need depends on what you use:
| Scope | Needed for |
|---|---|
monitoring |
All read operations — listing devices, organizations, alerts, and tickets |
management |
Write operations — rebooting devices, resetting alerts, creating/updating tickets and organizations |
control |
Not used by this server |
If your API app is granted fewer scopes than the default, set NINJAONE_SCOPES
to match. NinjaOne rejects a token request that asks for a scope the app was
never granted — it returns 400 invalid_scope rather than narrowing the grant —
so the failure happens at the token exchange and every tool call fails, including
reads. For a monitoring-only app:
export NINJAONE_SCOPES="monitoring"
Values may be comma- or space-separated and are case-insensitive. In gateway
deployments the same value can be supplied per request via the X-Ninja-Scopes
header.
License
Apache-2.0
Install
Add NinjaOne to your client. Pick the one you use.
claude mcp add ghcr-io-wyre-technology-ninjaone-mcp-v2- -- docker run -i --rm ghcr.io/wyre-technology/ninjaone-mcp:v2.2.9codex mcp add ghcr-io-wyre-technology-ninjaone-mcp-v2- -- docker run -i --rm ghcr.io/wyre-technology/ninjaone-mcp:v2.2.9amp mcp add ghcr-io-wyre-technology-ninjaone-mcp-v2- -- docker run -i --rm ghcr.io/wyre-technology/ninjaone-mcp:v2.2.9{
"mcpServers": {
"ghcr-io-wyre-technology-ninjaone-mcp-v2-": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/wyre-technology/ninjaone-mcp:v2.2.9"
]
}
}
}Add to `claude_desktop_config.json`, then restart Claude Desktop.
{
"mcpServers": {
"ghcr-io-wyre-technology-ninjaone-mcp-v2-": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/wyre-technology/ninjaone-mcp:v2.2.9"
]
}
}
}Add to `~/.cursor/mcp.json`, or `.cursor/mcp.json` for a single project.
code --add-mcp '{"name":"ghcr-io-wyre-technology-ninjaone-mcp-v2-","command":"docker","args":["run","-i","--rm","ghcr.io/wyre-technology/ninjaone-mcp:v2.2.9"]}'Or add the block manually to `.vscode/mcp.json` under `servers`.
{
"mcpServers": {
"ghcr-io-wyre-technology-ninjaone-mcp-v2-": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/wyre-technology/ninjaone-mcp:v2.2.9"
]
}
}
}Add to `~/.codeium/windsurf/mcp_config.json`.
{
"mcpServers": {
"ghcr-io-wyre-technology-ninjaone-mcp-v2-": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/wyre-technology/ninjaone-mcp:v2.2.9"
]
}
}
}Add to `cline_mcp_settings.json` via the MCP Servers panel.
{
"mcpServers": {
"ghcr-io-wyre-technology-ninjaone-mcp-v2-": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/wyre-technology/ninjaone-mcp:v2.2.9"
]
}
}
}Add to `~/.gemini/settings.json`.
{
"mcpServers": {
"ghcr-io-wyre-technology-ninjaone-mcp-v2-": {
"type": "local",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/wyre-technology/ninjaone-mcp:v2.2.9"
],
"tools": [
"*"
]
}
}
}Add to `~/.copilot/mcp-config.json`, or run `/mcp add` inside the CLI.
{
"context_servers": {
"ghcr-io-wyre-technology-ninjaone-mcp-v2-": {
"command": {
"path": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/wyre-technology/ninjaone-mcp:v2.2.9"
]
}
}
}
}Add to your Zed `settings.json`.
docker run -i --rm ghcr.io/wyre-technology/ninjaone-mcp:v2.2.9Run `goose configure`, choose **Add Extension → Command-line Extension**, and paste this command.
Score
39 / 100
Incomplete
- Documentation25/25
- Maintenance25/25
- Trust16/20
- Capability0/15
- Install experience12/15
- Documents what it does and how to connect
- Has a resolvable package or endpoint
- Exposes at least one tool, prompt or resource
- README has substantive content
- Includes a code example
- Documents its configuration
- Mentions credentials or security posture
- Last commit 1 days ago
- Has a release history
- Repository is not archived
- Licensed Apache-2.0
- Namespace verified in the official MCP registry
- Claimed by its owner
- Published under an organisation
- 0 tool(s) documented
- Provides prompt templates
- Provides resources
- 12 documented install method(s)
- Published to a package registry
- Offers a hosted endpoint — no local install
Version history
| Versions | Published |
|---|---|
| 2.2.9Latest | Aug 21, 2026 |
| 2.2.8 | Aug 20, 2026 |
| 2.2.7 | Aug 17, 2026 |
| 2.2.6 | Aug 13, 2026 |
| 2.2.5 | Aug 13, 2026 |
| 2.2.4 | Aug 10, 2026 |
| 2.2.3 | Aug 7, 2026 |
| 2.2.2 | Jul 29, 2026 |
| 2.2.1 | Jul 24, 2026 |
| 2.2.0 | Jul 24, 2026 |
| 2.1.0 | Jul 17, 2026 |
| 2.0.4 | Jul 13, 2026 |
| 2.0.3 | Jul 6, 2026 |
| 2.0.2 | Jul 5, 2026 |
| 2.0.1 | Jul 4, 2026 |
| 1.7.0 | Jun 2, 2026 |
| 1.6.7 | Jun 2, 2026 |
| 1.6.6 | May 28, 2026 |
| 1.6.5 | May 22, 2026 |
| 1.4.3 | May 19, 2026 |
| 1.6.4 | May 18, 2026 |
| 1.6.3 | May 5, 2026 |
| 1.6.2 | May 5, 2026 |
| 1.6.1 | May 4, 2026 |
| 1.4.2 | Apr 29, 2026 |
| 1.6.0 | Apr 29, 2026 |