Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Description from the maker (original English)
MCP server for NinjaOne RMM — devices, organizations, alerts, and tickets.
These three are never merged into one score: opinions, measurements and popularity are different things.
We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.
Pick the AI app you use, then copy the settings.
NINJAONE_CLIENT_ID, NINJAONE_CLIENT_SECRET, NINJAONE_REGION, MCP_TRANSPORT, AUTH_MODE, LOG_LEVELValues marked secret are keys to your account. Never share them or paste them into a chat.
You need
Which app do you use?
Pick your app above. We remember it, so next time the button says “Install in …”.
Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json
{
"mcpServers": {
"ninjaone": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"NINJAONE_CLIENT_ID",
"-e",
"NINJAONE_CLIENT_SECRET",
"-e",
"NINJAONE_REGION",
"-e",
"MCP_TRANSPORT",
"-e",
"AUTH_MODE",
"-e",
"LOG_LEVEL",
"ghcr.io/wyre-technology/ninjaone-mcp:v2.2.9"
],
"env": {
"NINJAONE_CLIENT_ID": "your-value",
"NINJAONE_CLIENT_SECRET": "your-value",
"NINJAONE_REGION": "your-value",
"MCP_TRANSPORT": "your-value",
"AUTH_MODE": "your-value",
"LOG_LEVEL": "your-value"
}
}
}
}Run this in your terminal
claude mcp add ninjaone --env NINJAONE_CLIENT_ID=your-value --env NINJAONE_CLIENT_SECRET=your-value --env NINJAONE_REGION=your-value --env MCP_TRANSPORT=your-value --env AUTH_MODE=your-value --env LOG_LEVEL=your-value -- docker run -i --rm -e NINJAONE_CLIENT_ID -e NINJAONE_CLIENT_SECRET -e NINJAONE_REGION -e MCP_TRANSPORT -e AUTH_MODE -e LOG_LEVEL ghcr.io/wyre-technology/ninjaone-mcp:v2.2.9Fill in the empty values before running it.
Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json
{
"mcpServers": {
"ninjaone": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"NINJAONE_CLIENT_ID",
"-e",
"NINJAONE_CLIENT_SECRET",
"-e",
"NINJAONE_REGION",
"-e",
"MCP_TRANSPORT",
"-e",
"AUTH_MODE",
"-e",
"LOG_LEVEL",
"ghcr.io/wyre-technology/ninjaone-mcp:v2.2.9"
],
"env": {
"NINJAONE_CLIENT_ID": "your-value",
"NINJAONE_CLIENT_SECRET": "your-value",
"NINJAONE_REGION": "your-value",
"MCP_TRANSPORT": "your-value",
"AUTH_MODE": "your-value",
"LOG_LEVEL": "your-value"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
Paste into .vscode/mcp.json in your project
{
"servers": {
"ninjaone": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"NINJAONE_CLIENT_ID",
"-e",
"NINJAONE_CLIENT_SECRET",
"-e",
"NINJAONE_REGION",
"-e",
"MCP_TRANSPORT",
"-e",
"AUTH_MODE",
"-e",
"LOG_LEVEL",
"ghcr.io/wyre-technology/ninjaone-mcp:v2.2.9"
],
"env": {
"NINJAONE_CLIENT_ID": "your-value",
"NINJAONE_CLIENT_SECRET": "your-value",
"NINJAONE_REGION": "your-value",
"MCP_TRANSPORT": "your-value",
"AUTH_MODE": "your-value",
"LOG_LEVEL": "your-value"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
This one runs on your computer, and ChatGPT can only connect to servers on the internet. Pick another app.
Your choice stays on this device in a cookie; no account needed.
NINJAONE_REGION envMCP_TRANSPORT envAUTH_MODE envLOG_LEVEL envThese settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.
Runs on your computer; the tool list appears in your AI app after you install it.
We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 8, 2026
The registry name was verified with the GitHub account wyre-technology, which owns the repo
We have not read this repo from GitHub yet
We have not read this repo from GitHub yet
This one runs on your computer; there is no internet endpoint
Runs on your computer and uses local settings instead
Runs on your computer; we can only read tool lists from internet endpoints
Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.
It passed 1 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.
You need to fill in: NINJAONE_CLIENT_ID, NINJAONE_CLIENT_SECRET
It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).
The GitHub repo last changed –, and the latest version (2.2.9) reached the registry 3 months ago.
Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Docker on your computer.
In the same category: Spec Driven Development, Remote Desktop Commander, Winecellarbuilders
Servers in the same category from other makers, sorted by stars.
Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Find the team for your wine room.
Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.
A Model Context Protocol (MCP) server for interacting with NinjaOne, featuring a decision tree architecture for efficient tool loading.
[!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, every
npm installneeds a
token. The cloud builder runs
npm installfor you, so you must give it one, or
the build fails with
npm error 401 Unauthorized ... npm.pkg.github.com.
1. Create a GitHub Personal Access Token with the
read:packagesscope
Any GitHub account works — you do not need to be a member of the
wyre-aiorg to read its public packages.
2. Add it as a build variable when prompted by the deploy flow:
- Cloudflare Workers → set a build variable named `NODE_AUTH_TOKEN` to your PAT
(Workers → Settings → Build → Variables and Secrets).
- DigitalOcean App Platform → set an encrypted env var named `GITHUB_TOKEN`
with 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 optionally
NINJAONE_REGION— or setAUTH_MODE=gatewayto take credentials
per-request from
X-Ninja-*headers. HTTP also requiresCONDUIT_S2S_SECRET
and a valid
X-Gateway-S2Ssignature on/mcp(see HTTP authentication).
The MCP endpoint is
/mcp;/healthis an unauthenticated liveness probe.
This MCP server uses a hierarchical tool loading approach instead of exposing all tools upfront:
ninjaone_navigate)This architecture provides:
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.
Copy .env.example and set the variables below.
| Variable | Required | Description |
|---|---|---|
NINJAONE_CLIENT_ID | For stdio and AUTH_MODE=env | OAuth 2.0 Client ID |
NINJAONE_CLIENT_SECRET | For stdio and AUTH_MODE=env | 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 |
MCP_TRANSPORT | No | stdio (default) or http |
AUTH_MODE | No | gateway (Docker image and Compose default) or env. Gateway mode requires X-Ninja-Client-ID and X-Ninja-Client-Secret on each /mcp request and never falls back to NINJAONE_*. env uses those variables only after S2S auth succeeds. |
CONDUIT_S2S_SECRET | Yes for HTTP | Service-to-service secret. The HTTP server logs an error and exits non-zero when this is empty or a known placeholder. Compose will not start without it. Never commit a real value. Generate one with openssl rand -hex 32. |
MCP_ALLOW_INSECURE_DEV | No | Set to exactly 1 only for local development to start HTTP without CONDUIT_S2S_SECRET. The process logs a warning, does not enforce X-Gateway-S2S, and binds 127.0.0.1 only. A known placeholder secret is still refused. |
MCP_HTTP_HOST | No | Bind address when MCP_TRANSPORT=http. Defaults to 127.0.0.1. Honored only when CONDUIT_S2S_SECRET is set. The container image sets 0.0.0.0. |
MCP_HTTP_PORT | No | HTTP port. Defaults to 8080. |
/health and /healthz stay unauthenticated and do not read credentials. The stdio transport does not use CONDUIT_S2S_SECRET.
With MCP_TRANSPORT=http and CONDUIT_S2S_SECRET set, every /mcp request must include:
X-Gateway-S2S: t=<unix seconds>,v1=<hex>
v1 is HMAC-SHA256 of the ASCII string t= (the same t= prefix that is sent in the header), keyed with CONDUIT_S2S_SECRET, and hex-encoded. The timestamp must be within 300 seconds of the server clock. A missing or invalid header returns 401 before any vendor credential is read. The secret value is never written to logs.
In AUTH_MODE=gateway, /mcp also requires X-Ninja-Client-ID and X-Ninja-Client-Secret (X-Ninja-Region is optional). Those headers are the only credential source for that request. A request missing them returns 401 and does not fall back to NINJAONE_CLIENT_ID / NINJAONE_CLIENT_SECRET.
MCP_ALLOW_INSECURE_DEV=1 skips the X-Gateway-S2S check for local development and forces the listener onto 127.0.0.1. A non-loopback MCP_HTTP_HOST, including 0.0.0.0, is ignored in that mode and the override is logged.
| 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 |
# Set credentials
export NINJAONE_CLIENT_ID="your-client-id" export NINJAONE_CLIENT_SECRET="your-client-secret" export NINJAONE_REGION="us"
npx @wyre-ai/ninjaone-mcp
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" } } } }
The image listens on 0.0.0.0 inside the container (MCP_HTTP_HOST) and defaults to AUTH_MODE=gateway. Publish the port on loopback and pass the S2S secret. In gateway mode, NinjaOne credentials arrive on each request as X-Ninja-* headers; they are not read from the environment.
docker build -t ninjaone-mcp .
docker run \ -e CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" \ -p 127.0.0.1:8080:8080 \ ninjaone-mcp
Compose refuses to start when CONDUIT_S2S_SECRET is unset, defaults AUTH_MODE to gateway, publishes 127.0.0.1:8080:8080, and does not inject NINJAONE_CLIENT_ID or NINJAONE_CLIENT_SECRET:
CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" docker compose up
Single-tenant HTTP (AUTH_MODE=env) still requires the S2S secret, then uses NINJAONE_CLIENT_ID and NINJAONE_CLIENT_SECRET:
docker run \
-e CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" \ -e AUTH_MODE=env \ -e NINJAONE_CLIENT_ID=your-client-id \ -e NINJAONE_CLIENT_SECRET=your-client-secret \ -e NINJAONE_REGION=us \ -p 127.0.0.1:8080:8080 \ ninjaone-mcp
Local HTTP without a secret is development-only. It binds 127.0.0.1 only and logs a warning:
MCP_TRANSPORT=http MCP_ALLOW_INSECURE_DEV=1 npm start
Sign each /mcp request with X-Gateway-S2S as described in HTTP authentication. In gateway mode, also send X-Ninja-Client-ID and X-Ninja-Client-Secret.
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 returns hasMore: true and a cursor to 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 fieldsManage 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 organization. device_class is sent upstream as df=class= and applied to each page. The response is { devices, count, hasMore, cursor }, not a bare array.ninjaone_organizations_get_custom_fields - Get organization custom fieldsninjaone_organizations_update_custom_fields - Update organization custom fieldsView 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 summaryFeatures:
ninjaone_alerts_get renders as an interactive card in MCP Apps hosts (Claude Desktop/web) with an in-card "Reset alert" round-trip via ninjaone_alerts_reset; neutral by default, brandable via window.__BRAND__ injection or MCP_BRAND_* env vars; plain-JSON behavior is unchanged in other hostsManage service tickets.
Tools:
ninjaone_tickets_list - List tickets from a board (requires board_id; status/organization_id/device_id filters are applied client-side, see notes below)ninjaone_tickets_get - Get ticket detailsninjaone_tickets_create - Create a new ticket (requires a ticket_form_id)ninjaone_tickets_update - Update an existing ticket's fieldsninjaone_tickets_add_comment - Add a comment to a ticketninjaone_tickets_comments - Get ticket log entries, optionally filtered by typeninjaone_tickets_boards_list - List ticket boards (to discover board_id values)ninjaone_tickets_forms_list - List ticket forms (to discover ticket_form_id values)ninjaone_tickets_form_get - Get one ticket form with its field definitionsninjaone_tickets_statuses_list - List the tenant's configured ticket staOnly the beginning is shown; read the rest in the repo