Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
คำอธิบายจากผู้ทำ (ภาษาอังกฤษตามต้นฉบับ)
MCP server for NinjaOne RMM — devices, organizations, alerts, and tickets.
สามเรื่องนี้ไม่รวมเป็นคะแนนเดียว เพราะความเห็น การวัด และความนิยม เป็นคนละเรื่องกัน
ตัวนี้ยังไม่ได้เรียบเรียงเป็นภาษาไทย ด้านล่างคือข้อเท็จจริงที่เราอ่านจาก registry
เลือกโปรแกรม AI ที่คุณใช้ แล้วคัดลอกค่าตั้งไปวาง
NINJAONE_CLIENT_ID, NINJAONE_CLIENT_SECRET, NINJAONE_REGION, MCP_TRANSPORT, AUTH_MODE, LOG_LEVELค่าที่ติดป้ายความลับคือกุญแจของบัญชีคุณ อย่าส่งให้ใคร และอย่าวางในแชต
ต้องเตรียมก่อน
คุณใช้แอปไหน
เลือกแอปด้านบน เราจำไว้ให้ ครั้งหน้าปุ่มจะขึ้นว่า “ติดตั้งลง …”
เปิด Claude Desktop → Settings → Developer → Edit Config แล้ววางค่านี้ในไฟล์ 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-ai/ninjaone-mcp:v2.5.2"
],
"env": {
"NINJAONE_CLIENT_ID": "ใส่ค่าของคุณ",
"NINJAONE_CLIENT_SECRET": "ใส่ค่าของคุณ",
"NINJAONE_REGION": "ใส่ค่าของคุณ",
"MCP_TRANSPORT": "ใส่ค่าของคุณ",
"AUTH_MODE": "ใส่ค่าของคุณ",
"LOG_LEVEL": "ใส่ค่าของคุณ"
}
}
}
}พิมพ์คำสั่งนี้ใน Terminal
claude mcp add ninjaone --env NINJAONE_CLIENT_ID='ใส่ค่าของคุณ' --env NINJAONE_CLIENT_SECRET='ใส่ค่าของคุณ' --env NINJAONE_REGION='ใส่ค่าของคุณ' --env MCP_TRANSPORT='ใส่ค่าของคุณ' --env AUTH_MODE='ใส่ค่าของคุณ' --env LOG_LEVEL='ใส่ค่าของคุณ' -- 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-ai/ninjaone-mcp:v2.5.2เติมค่าที่เว้นว่างไว้ก่อนรัน
วางในไฟล์ .cursor/mcp.json ของโปรเจกต์ หรือ ~/.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-ai/ninjaone-mcp:v2.5.2"
],
"env": {
"NINJAONE_CLIENT_ID": "ใส่ค่าของคุณ",
"NINJAONE_CLIENT_SECRET": "ใส่ค่าของคุณ",
"NINJAONE_REGION": "ใส่ค่าของคุณ",
"MCP_TRANSPORT": "ใส่ค่าของคุณ",
"AUTH_MODE": "ใส่ค่าของคุณ",
"LOG_LEVEL": "ใส่ค่าของคุณ"
}
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
วางในไฟล์ .vscode/mcp.json ของโปรเจกต์
{
"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-ai/ninjaone-mcp:v2.5.2"
],
"env": {
"NINJAONE_CLIENT_ID": "ใส่ค่าของคุณ",
"NINJAONE_CLIENT_SECRET": "ใส่ค่าของคุณ",
"NINJAONE_REGION": "ใส่ค่าของคุณ",
"MCP_TRANSPORT": "ใส่ค่าของคุณ",
"AUTH_MODE": "ใส่ค่าของคุณ",
"LOG_LEVEL": "ใส่ค่าของคุณ"
}
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
ตัวนี้รันในเครื่องคุณ แต่ ChatGPT ต่อได้เฉพาะ server บนอินเทอร์เน็ต ลองเลือกแอปอื่น
ตัวเลือกเก็บในคุกกี้บนเครื่องนี้ ไม่ต้องมีบัญชี
NINJAONE_REGION envMCP_TRANSPORT envAUTH_MODE envLOG_LEVEL envค่าตั้งนี้สร้างจากข้อมูลใน registry ของผู้ทำ ถ้าไม่ตรงกับ README ให้เชื่อ README
รันในเครื่องคุณ รายการเครื่องมือจะขึ้นในแอป AI หลังติดตั้ง
เราตรวจจากข้อมูลที่ใครก็เปิดดูได้ ยังไม่ได้อ่านโค้ด ข้อที่ไม่เกี่ยวกับตัวนี้ไม่นับในตัวหาร · ตรวจเมื่อ 8 พ.ย. 2569
ชื่อใน registry ยืนยันด้วยบัญชี GitHub WYRE-AI ซึ่งเป็นเจ้าของ repo
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ตัวนี้รันบนเครื่องคุณ ไม่มี endpoint บนอินเทอร์เน็ต
ตัวนี้รันบนเครื่อง ใช้ค่าที่ตั้งในเครื่องแทน
รันในเครื่องคุณ เราอ่านรายการเครื่องมือได้เฉพาะตัวที่มี endpoint บนอินเทอร์เน็ต
เทียบกับทุก server ที่ยังใช้งานในหมวดนี้ทั้งทะเบียน ดาวนับเฉพาะเมื่อผู้ลงทะเบียนเป็นเจ้าของ repo
จากการตรวจเบื้องต้นของเรา ผ่าน 1 จาก 1 ข้อที่ตรวจได้ เรายังไม่ได้อ่านโค้ด ก่อนใส่กุญแจหรือ token ให้ดูว่า server ขอสิทธิ์อะไร และเลือกกุญแจที่ทำได้เท่าที่จำเป็น
ต้องใส่ค่าเหล่านี้: NINJAONE_CLIENT_ID, NINJAONE_CLIENT_SECRET
รันบนเครื่องของคุณ โปรแกรม AI จะเปิด server ขึ้นมาเองเมื่อใช้ ข้อมูลไม่ต้องผ่านเซิร์ฟเวอร์ของผู้ทำ (ยกเว้นตัวที่ไปเรียกบริการออนไลน์ต่อ)
repo บน GitHub มีการแก้โค้ดล่าสุด – และส่งรุ่นล่าสุด (2.5.2) เข้า registry 16 วันที่ผ่านมา
โปรแกรมที่รองรับ MCP เช่น Claude Desktop, Claude Code, Cursor และ VS Code ตัวนี้ต้องมี Docker ในเครื่องด้วย
ในหมวดเดียวกันมี Spec Driven Development, Remote Desktop Commander, SolveHub
server หมวดเดียวกันจากผู้ทำคนอื่น เรียงตามดาว
อ่านการ์ด:↓ ดาวน์โหลดต่อสัปดาห์i★ ดาว GitHubiสามเสา: รีวิว · ผลตรวจ · การใช้งานiอัปเดต = วันที่ส่งรุ่นล่าสุดเข้า 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.
CAPTCHA and anti-bot solving for Turnstile, DataDome, Akamai, PerimeterX and Imperva.
ส่วนนี้คัดจาก repo ของผู้ทำตามต้นฉบับ PopNx MCP ไม่ได้ตรวจหรือรับรองเนื้อหา ตัด HTML รูปภาพ และสคริปต์ออกแล้ว ลิงก์จะพาออกนอกเว็บ
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 staตัดมาแค่ช่วงต้น อ่านต่อใน repo