Alloy Navigator

io.github.WYRE-AI由 GitHub 帳號 WYRE-AI 發布v1.0.1更新於 Oct 24, 2026

MCP server for Alloy Navigator's REST API - IT asset management and ITSM data for MSPs.

發布方自己的服務:Alloy

已驗證STDIO僅桌面資料與分析商業與電商

概覽

AI 產生的概覽

針對 Alloy Navigator REST API 的唯讀 MCP 伺服器,讓助理查詢事件、工單、資產、軟體目錄等 ITSM 與 IT 資產紀錄。

可以做什麼
  • 依物件類別列出與搜尋物件,支援欄位選擇、排序、分頁、全文搜尋與依欄位篩選
  • 依 OID 或紀錄 GUID 讀取單一物件的所有欄位
  • 讀取某個物件的活動與歷程紀錄,例如狀態與指派變更
  • 查詢某個物件類別上某欄位允許的參考值與分類值
適用情境
適合需要查詢或彙整自架 Alloy Navigator 執行個體中資料(事件、工單、資產、耗材、軟體目錄)而不做任何變更的情境。較適用於唯讀報表與問題排查,而非建立或更新紀錄。
執行需求
以本機程序(stdio)或 HTTP 容器方式執行。需要 Alloy Navigator 執行個體的基底網址(ALLOY_BASE_URL)、應用程式帳號的用戶端 ID 與密鑰(ALLOY_CLIENT_ID、ALLOY_CLIENT_SECRET),且目標執行個體已安裝並啟用 API 模組。HTTP 模式另需 CONDUIT_S2S_SECRET;閘道模式從 X-Alloy-* 標頭取得憑證。
安裝前請注意
需要 Alloy Navigator 應用程式帳號的用戶端密鑰;建議建立專用的最小權限帳號,因為該憑證的讀取範圍並無文件說明,唯讀保證來自工具介面而非憑證本身。HTTP 模式需要 CONDUIT_S2S_SECRET,不可使用預留值或提交到版本庫。MCP_ALLOW_INSECURE_DEV 僅限本機開發。此連接器未在真實執行個體上驗證。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Alloy Navigator,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

Alloy Navigator MCP Server

MCP server for Alloy Navigator's REST API - IT asset management, ITSM, and network inventory data (incidents, work orders, assets, software catalog, consumables, and more) for AI assistants and the WYRE Conduit gateway.

Authentication

Alloy Navigator authenticates third-party applications with the OAuth2 client_credentials grant. An application account is registered in the Alloy Navigator Settings App under Services > API > Applications, which issues a client ID and client secret. This connector exchanges those for a bearer access token by POSTing to <base URL>/api/token, then sends Authorization: Bearer <token> on every subsequent request. Access tokens are valid for 8 hours per Alloy Navigator's own documentation; this connector caches a token per credential set and transparently re-authenticates once it's near expiry (see src/auth.ts).

Alloy Navigator has no fixed hosted API endpoint - every instance (on-premises, or a customer's own self-hosted-cloud tenant) is deployed at its own base URL, so this connector requires all three of a base URL, a client ID, and a client secret. In gateway mode all three arrive per-request via the X-Alloy-Base-Url, X-Alloy-Client-Id, and X-Alloy-Client-Secret headers; in local/stdio mode they're read once from ALLOY_BASE_URL, ALLOY_CLIENT_ID, and ALLOY_CLIENT_SECRET.

Alloy Navigator's API module (and this connector's application-account grant type specifically) requires the API Module to be installed and enabled on the target instance - see Alloy Navigator's own Installation Guide ("Installing and Configuring the API Module") if a client_credentials request returns a connection or 404 error rather than an auth error.

Credential scope

Vendor-documented, not independently verified against a live account (see Verification below for why): Alloy Navigator's API User's Guide describes application accounts as accounts used by "third-party applications that run without a signed-in user present," distinct from a regular technician (username/password) account, but does not document a way to scope an application account's read access below whatever object classes and fields the account otherwise has permission to see in Alloy Navigator's own security/role configuration. In practice this means the actual read-only guarantee is enforced by this connector's tool surface (GET-only, no workflow-action execution), not by the credential itself - Alloy Navigator's own workflow-action model means even a technically "read" API call executes through the same account whose role could, in principle, also be granted write/workflow-action permissions elsewhere. Customers should create a dedicated, minimally-privileged application account for this connector, matching the same practice recommended by other vendors in this fleet (e.g. PRTG) whose API keys inherit the creating account's full permission set.

Verification

This connector was built directly against Alloy Navigator's official API User's Guide (docs.alloysoftware.com/alloynavigator/docs/api-userguide/), not against secondary documentation or a naming convention - every tool below maps to one real, documented GET operation, with its exact query parameters and response shape verified against the guide's own worked examples (see each tool's JSDoc in src/client.ts for the source example it was checked against). What it is not is independently verified against a live Alloy Navigator instance: Alloy Navigator does not publish a public self-serve trial or sandbox instance, and provisioning one requires a live sales/licensing engagement this build environment could not complete. This is a build-environment limitation, not a vendor-side approval gate for a customer with an existing license.

Configuration

Env varDescription
ALLOY_BASE_URLBase URL of the Alloy Navigator server, e.g. https://alloy.example.com.
ALLOY_CLIENT_IDApplication account client ID, issued under Settings App > Services > API > Applications.
ALLOY_CLIENT_SECRETApplication account client secret, issued alongside the client ID.
MCP_TRANSPORTstdio (default) or http.
AUTH_MODEenv (default, reads the vars above) or gateway (credentials arrive per-request via the X-Alloy-Base-Url / X-Alloy-Client-Id / X-Alloy-Client-Secret headers, injected by the Conduit gateway). The Docker image and Compose file default to gateway. In gateway mode, /mcp returns 401 when any of those headers is missing and never falls back to ALLOY_*.
CONDUIT_S2S_SECRETRequired for HTTP. Service-to-service secret. The HTTP server logs an error and exits non-zero when this is empty or a known placeholder (changeme, secret, placeholder, your-s2s-secret, replace-with-a-real-secret, and the same list in src/http.ts). Compose will not start when it is unset. Never commit a real value. The process never logs it.
MCP_ALLOW_INSECURE_DEVSet to exactly 1 only for local development to start HTTP without CONDUIT_S2S_SECRET. The process logs a warning, skips X-Gateway-S2S, and listens on 127.0.0.1 only. A wider MCP_HTTP_HOST is overridden. A known placeholder secret is still refused.
MCP_HTTP_HOSTBind address when MCP_TRANSPORT=http. Defaults to 127.0.0.1. A configured CONDUIT_S2S_SECRET honors this value, including 0.0.0.0. The container image sets 0.0.0.0. Without a secret, the listener is 127.0.0.1 only.
MCP_HTTP_PORTHTTP port. Defaults to 8080.
LOG_LEVELdebug | info (default) | warn | error.

/health stays unauthenticated and does not read credentials. The stdio transport does not use CONDUIT_S2S_SECRET.

HTTP authentication

With MCP_TRANSPORT=http and CONDUIT_S2S_SECRET set, every /mcp request must include X-Gateway-S2S. A missing or invalid header returns 401 before any vendor credential is read.

The header is an HMAC proof, not a copy of the secret:

text
t=<unix seconds>,v1=<hex hmac-sha256>

<hex hmac-sha256> is HMAC-SHA256 of the ASCII string t=<unix seconds> (the same t= prefix and the same decimal timestamp), keyed with CONDUIT_S2S_SECRET, encoded as lowercase hex. The timestamp must be within 300 seconds of the server clock.

js
import { createHmac } from 'node:crypto';
const secret = process.env.CONDUIT_S2S_SECRET;const t = Math.floor(Date.now() / 1000);const v1 = createHmac('sha256', secret).update(`t=${t}`).digest('hex');const xGatewayS2s = `t=${t},v1=${v1}`;

In AUTH_MODE=gateway, /mcp also requires X-Alloy-Base-Url, X-Alloy-Client-Id, and X-Alloy-Client-Secret. Those headers are the only credential source for that request.

js
await fetch('http://127.0.0.1:8080/mcp', {  method: 'POST',  headers: {    'content-type': 'application/json',    accept: 'application/json, text/event-stream',    'x-gateway-s2s': xGatewayS2s,    'x-alloy-base-url': 'https://alloy.example.com',    'x-alloy-client-id': 'application-client-id',    'x-alloy-client-secret': 'application-client-secret',  },  body: JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'tools/list' }),});

Tools

Alloy Navigator's API is class-generic rather than one fixed REST path per object type (unlike, say, PRTG's /devices, /sensors, etc.) - a single object class parameter (Incidents, Computers, Work Orders, Consumables, SoftwareCatalog, Purchase Order Items, and so on) selects what you're querying. This connector's 4 tools mirror that shape faithfully rather than inventing per-class tools Alloy Navigator's own API doesn't have.

Objects

  • alloy_list_objects - list/search objects of a given object class, with field selection, sorting, paging, free-text search, and per-field filters.
  • alloy_get_object - get every field of a single object by its OID (ticket number) or database record GUID.

Activities

  • alloy_get_object_activities - get the activity/history log entries recorded against a single object (status changes, assignment changes, system notes).

Dictionary

  • alloy_get_dictionary - get the allowed reference/classification values (e.g. valid Status or Types values) for a field on an object class.

Scope

This is a deliberately narrow, read-only v1 surface: 4 GET operations covering exactly Alloy Navigator's generic object query, single-object read, activity/history read, and reference-value lookup - nothing else. Alloy Navigator's API User's Guide documents a significantly larger surface built around workflow actions (Alloy Navigator does not create or update objects directly; every mutation runs as a named workflow action against an object). This connector excludes every one of those by design, not by oversight:

Hard-excluded (object creation and mutation - all mutation in Alloy Navigator's API model runs through workflow actions) - never implemented: POST /object/<oid>/action/<actionId> - executing a workflow action (the mechanism Alloy Navigator's own "Creating objects" documentation describes for creating new incidents, work orders, assets, and any other object) is a write by definition and is excluded outright, including any workflow action a customer's instance might label as innocuous-sounding (e.g. an "Acknowledge" or "Close" action) - this connector has no way to distinguish a read-flavored action from a real state-changing one, so none are exposed.

Hard-excluded (redundant POST-based retrieval) - never implemented: Alloy Navigator's guide documents POST variants of both the object-list and object-activities GET endpoints (POST /<objectClass>, POST /Activities/<oid>), intended to work around URL query-length limits when a caller constructs a raw URL by hand. This connector builds every request server-side from structured tool arguments rather than a hand-typed URL, so the length limit the POST variant exists to work around doesn't apply here - implementing it would add a second code path with identical behavior and no read/write distinction of its own, so it's excluded as redundant rather than as a scope boundary.

Hard-excluded (user/session/application administration - identity and credential management, not ITSM/asset data) - never implemented: the technician (username/password) authentication grant (POST /api/token with grant_type=password) - this connector only uses the application-account client_credentials grant, the shape intended for unattended service integrations - and any endpoint for managing application accounts, technician accounts, or sessions themselves.

Hard-excluded (out of ITSM/asset-data scope) - never implemented: GET /api/v2/GetAppConfig - configuration for a registered mobile scanner application (Settings App > Services > Mobile Applications), unrelated to IT asset/ITSM record data and dependent on a customer having registered a mobile app in the first place.

They can be added as a follow-up if there's demand, after a deliberate scope decision - not by default.

Development

bash
npm installnpm run buildnpm testnpm run lint   # tsc --noEmit

Docker

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, Alloy Navigator credentials arrive on each request as X-Alloy-* headers; the image does not read them from the environment.

bash
docker build -t alloy-navigator-mcp .docker run \  -e CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" \  -p 127.0.0.1:8080:8080 \  alloy-navigator-mcp

Compose refuses to start when CONDUIT_S2S_SECRET is unset, sets AUTH_MODE=gateway, publishes 127.0.0.1:8080:8080, and passes no ALLOY_* variables:

bash
CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" docker compose up

Single-tenant HTTP (AUTH_MODE=env) still requires the S2S secret, then uses ALLOY_BASE_URL, ALLOY_CLIENT_ID, and ALLOY_CLIENT_SECRET:

bash
docker run \  -e CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" \  -e AUTH_MODE=env \  -e ALLOY_BASE_URL=https://alloy.example.com \  -e ALLOY_CLIENT_ID=your-client-id \  -e ALLOY_CLIENT_SECRET=your-client-secret \  -p 127.0.0.1:8080:8080 \  alloy-navigator-mcp

Local HTTP without a secret is development-only. It binds 127.0.0.1 and logs a warning. A non-loopback MCP_HTTP_HOST is overridden to 127.0.0.1:

bash
MCP_TRANSPORT=http MCP_ALLOW_INSECURE_DEV=1 npm run start:http

來源:README.md,提交 ff63cbb

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

2
  1. v1.0.1最新Oct 17, 2026
  2. v1.0.0Sep 21, 2026

評分

已滿足適用檢查項的 40%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

    請在儲存庫或註冊中心條目中宣告授權條款。

其他 Alloy 整合