
Snipe-IT (unofficial)
io.github.mguttmann由 GitHub 帳號 mguttmann 發布v0.2.2更新於 Oct 30, 2026
Unofficial MCP server for the Snipe-IT REST API: assets, users, licenses, guarded writes.
概覽
針對 Snipe-IT IT 資產管理 REST API 的非官方 MCP 伺服器,讓助理查詢資產、使用者、授權等資料,並在寫入保護下進行變更。
- 可以做什麼
- 依 ID、資產標籤或序號查詢資產,依條件列出硬體,查看待稽核與逾期稽核項目
- 讀取使用者及其名下資產、配件與授權,以及授權席次
- 列出並借出或歸還配件、耗材與元件,建立維護紀錄
- 建立、更新、軟刪除硬體,並批次借出,回傳逐項結果
- 呼叫內建 Snipe-IT OpenAPI 規格中的任一操作,或對設定的基底網址下任意路徑送出原始請求
- 以資源形式讀取目前使用者、設定與硬體彙總,並執行稽核、到職與授權健康檢查提示詞
- 適用情境
- 當你希望助理直接回答組織 Snipe-IT 庫存的問題,或在對話中完成到職借出、稽核、授權席次核對等日常資產流程時適用。
- 執行需求
- 透過 npx 以 stdio 在本機執行(需 Node.js 22.12 或更新版本),也可全域安裝。需要 SNIPEIT_API_BASE(含 /api/v1 的執行個體網址)與 SNIPEIT_API_TOKEN(Snipe-IT 個人 API 權杖)。選用設定涵蓋逾時、結果大小、記錄層級、唯讀模式、去識別化與強制預覽。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 Snipe-IT (unofficial),將其新增到工作區。
- 為需要使用其工具的對話啟用該服務。
Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。
其他 MCP 客戶端
參照 儲存庫 中的啟動說明。
README
the-real-snipeit-mcp
An unofficial MCP server for the Snipe-IT REST API: one generated tool for every operation in the vendored Snipe-IT OpenAPI 3.1 spec (read + write), hand-written wrappers for common workflows, stdio transport.
Unofficial, not affiliated with Snipe-IT/Grokability. This project is not affiliated with, endorsed by, sponsored by or supported by Grokability, Inc. or the Snipe-IT project. "Snipe-IT" is a trademark of its owner. The vendored API description and its license situation are described in NOTICE.
Three tool layers (183 tools):
- 37 hand-wrappers (
snipeit_*): friendlier UX for common workflows - 145 generated tools (
snipeit_gen_*): one per operation of the vendored spec (vendor/snipe-it-rest-api.json, Snipe-IT 8.2.0) snipeit_raw_request: escape hatch for any method and path underSNIPEIT_API_BASE
Plus 3 resources and 3 prompts. The counts are held by tests/unit/docsFacts.test.ts.
Maintenance status
- Maintained on a best-effort basis by one maintainer (@mguttmann) in spare time. The author runs it in production behind a private MCP gateway. There is no support contract and no guaranteed response time.
- Security fixes take priority over features. Report vulnerabilities privately through GitHub Private Vulnerability Reporting, never in a public issue (see
SECURITY.md). - Dependency updates come from Dependabot; CI fails when a runtime dependency has a known high or critical advisory.
- Supported Node.js versions: 22.12 or newer (
enginesinpackage.json); CI tests Node 22, 24 and 26. - Only the latest minor release gets fixes. Releases and their changes:
CHANGELOG.md. - Issues and pull requests are welcome; see
CONTRIBUTING.md.
Install
Requires Node.js 22.12 or newer. The server needs SNIPEIT_API_BASE (your instance, including /api/v1) and SNIPEIT_API_TOKEN; all other variables are optional (see Configuration). Only the npm package the-real-snipeit-mcp and the MCP Registry name io.github.mguttmann/the-real-snipeit-mcp are this project.
npx (any stdio MCP host)
npx fetches and runs the package; no clone or build is needed. Attach it to Claude Code (type the token in your shell, never into a chat):
Any other stdio host takes the same command in its JSON configuration (Claude Desktop: claude_desktop_config.json):
A configuration file with these values holds the token: keep it readable for your user only and out of version control. the-real-snipeit-mcp@<version> pins a version.
Global install
The command is the-real-snipeit-mcp; use it as "command" in the host configuration above (without args).
From source
npm run inspector opens the MCP Inspector against the built server.
Pinned install for gateways and servers
For an unattended host, install an exact version from a committed lockfile, without install scripts and without dev dependencies, and check the registry signatures and provenance attestations:
Each release on GitHub Releases carries the npm tarball, a CycloneDX SBOM and SHA256SUMS; releases published by the release workflow carry an npm provenance statement and a GitHub build provenance attestation.
MCP Registry and Glama
Each stable release is listed in the official MCP Registry as io.github.mguttmann/the-real-snipeit-mcp (the npm package, with its environment variables). glama.json names the maintainer of the Glama listing.
Configuration
Variables come from the environment, from node --env-file=<file>, or from a .env in the working directory (or DOTENV_CONFIG_PATH), which never overrides a variable that is already set. The names (never the values) of the variables a .env added are logged to stderr at startup.
Tool reference
Hand-wrappers (37 tools)
Identity (1)
Hardware / Assets (13)
Users (5)
Licenses (3)
Accessories / Consumables / Components (8)
Locations / Status-Labels / Maintenances (6)
Bulk (1)
List tools (snipeit_list_*) accept limit?, offset?, and all?: boolean. With all: true, the tool auto-paginates up to 10 000 rows or until the result would exceed SNIPEIT_MAX_RESULT_BYTES; in that case it returns the rows collected so far with truncated: true, next_offset and total, and you continue with limit/offset.
Auto-generated tools (snipeit_gen_*)
Every operation (path and method) in the vendored Snipe-IT OpenAPI 3.1 spec is exposed as snipeit_gen_<snake_operation_id>. Each title is METHOD /path, and each description starts with METHOD /path: followed by the spec's description of the operation. The two file-upload operations (POST /hardware/{id}/files, POST /models/{id}/files) cannot upload: the vendored spec declares a JSON body, Snipe-IT expects multipart/form-data; their descriptions say so. Use these when the hand-wrapper layer doesn't cover what you need. GET tools have readOnlyHint: true; all other methods have destructiveHint: true and go through the write guard. Regenerate with npm run codegen after npm run refresh-spec.
snipeit_raw_request
Escape hatch for anything else:
Its annotations are static (destructiveHint: true, idempotentHint: false) for every method. GET requests bypass the write guard; other methods honor SNIPEIT_CONFIRM_WRITES. The path must start with a single /; absolute URLs and paths that leave SNIPEIT_API_BASE are rejected.
Resources
Prompts
Workflows / Recipes
Onboard a new user with a laptop
- Confirm the user:
snipeit_get_user(id: 42) - Find an available laptop:
snipeit_list_hardware(category_id: 3, status_id: 5)(ready-to-deploy) - Checkout:
snipeit_checkout_hardware(id: 100, checkout_to_type: "user", assigned_user: 42, note: "Onboarding 2026-05-25")
Bulk-checkout a kit to one user
Continues on per-item errors. Returns {summary: {total, ok, errors}, results: [...]}.
Audit overdue cleanup
snipeit_list_audit_overdue(all: true): full list, auto-paginated- For each:
snipeit_audit_hardware(asset_tag: "...", location_id: 1, next_audit_date: "2027-05-25")
Find an asset by tag or serial
- By asset tag:
snipeit_get_hardware_by_tag(tag: "A-42")(handles URL encoding) - By serial:
snipeit_get_hardware_by_serial(serial: "SN12345")
Discover what an LLM can do
Browse the MCP Inspector:
Write safety
The write guard is on by default: every tool with destructiveHint: true returns a redacted preview instead of executing; re-invoke it with confirm: "YES" to execute. The preview names the tool, the method, the URL, the query parameters and a redacted body (password/secret/token/api_key fields replaced with (redacted)); snipeit_bulk_checkout lists each concrete request. A preview is a normal result, not an error: its text has status: "preview" and its _meta carries "snipeit/preview": true, so a client can tell it from an executed write without parsing. Every write tool shows the full URL (SNIPEIT_API_BASE + path).
Only SNIPEIT_CONFIRM_WRITES set to false, 0, no or off (trimmed, any case) disables the guard so write tools execute directly. Unset, true/1/yes/on, an empty value or anything else keeps it on; an empty or unrecognised value also logs a warning. The effective state is logged to stderr once at startup.
confirm is set by the model, so the guard catches a model that forgets it, not a prompt injection in Snipe-IT data that adds it; human approval has to come from the MCP host or gateway. Two optional switches tighten it on the server side:
SNIPEIT_READ_ONLY=truerefuses every write with aREAD_ONLYtool error; all tools stay registered (the tool list does not change) and reads work, includingsnipeit_raw_requestwith GET.SNIPEIT_REQUIRE_PREVIEW=true(with the guard on) executesconfirm: "YES"only after a preview of the identical request in the last 10 minutes, once per preview, so every write is previewed first.
Independent of these settings, every write tool (hand-written, generated, snipeit_bulk_checkout and snipeit_raw_request with a method other than GET) refuses a body or query in which any value, at any depth of objects and arrays, is exactly (redacted), the placeholder of previews, SNIPEIT_REDACT_SECRETS and SNIPEIT_REDACT_PII. It returns a tool error with details.code: "REDACTED_PLACEHOLDER" and details.paths (for example body.custom_fields["BitLocker Key"].value, body[2].password, items[2].note, query.token), before the preview, SNIPEIT_READ_ONLY and the request, so an asset read with redaction on and written back unchanged cannot overwrite a recovery key with the placeholder. A string that only contains (redacted) is sent as before. Set the real value or omit the field.
Every preview, refusal and confirmed execution logs one info line (tool, method, URL), and every executed write request logs one info line with its HTTP status (no query, no body).
Snipe-IT API quirk
Snipe-IT often returns HTTP 200 with {"status":"error","messages":…} for validation errors. This server detects that envelope and surfaces the messages as a tool error (with isError: true), so callers never accidentally treat a Snipe-IT error as success. Successful envelopes ({"status":"success","payload":…}) are unwrapped automatically so tool data is the inner payload, not the outer wrapper.
Large and binary results
- Size cap. Every tool result is limited to
SNIPEIT_MAX_RESULT_BYTES(default 1 MiB). Lists ({total, rows}) keep the leading rows that fit and gaintruncated: trueandnext_offset; the pagination hint is adjusted to match. Top-level arrays keep the leading items with atruncatedobject next todata. Any other oversized result is replaced by{truncated: true, size_bytes, max_result_bytes, note}. The output is always valid JSON, never a cut string. - Body read bound. A single HTTP response body is read up to the larger of 16 MiB and 4 times
SNIPEIT_MAX_RESULT_BYTES; a larger JSON or text body fails with aRESPONSE_TOO_LARGEtool error instead of being buffered. - Binary downloads. Responses whose content type is not JSON, XML or
text/*(for example backup zips, uploaded files, images, PDFs) are not decoded. The tool returns{binary: true, content_type, size_bytes, size_exact, filename, note}; download the file from Snipe-IT directly if you need its content. - Timeouts, retries, redirects.
SNIPEIT_TIMEOUT_MScovers each attempt including the body read. 429 is always retried; 5xx and network errors are retried only for idempotent methods (GET, PUT, DELETE); POST and PATCH are retried only when the connection was never established (ECONNREFUSED,ENOTFOUND,EAI_AGAIN), so a write is never sent twice. Redirects are never followed. A cancelled tool call (MCP cancellation or a closed client) aborts its HTTP request and any retry backoff at once;SNIPEIT_CALL_DEADLINE_MSoptionally bounds a whole call.
Develop
See ARCHITECTURE.md for the layer diagram and data flow. See CONTRIBUTING.md for adding hand-wrappers, regenerating the codegen layer, and debugging.
Security
- API token is read from
SNIPEIT_API_TOKENenv only. Never hard-coded..envis git-ignored. - Versions 0.1.7 and older can send the token to another host through
snipeit_raw_requestwith an absolute URL; upgrade to 0.2.0 or newer (seeCHANGELOG.md). - The logger and every error text returned to the model redact known secret patterns (Bearer tokens, JWTs,
Authorizationheaders of any scheme,api_token/password/secret/token/api_keyfields and query parameters, URL userinfo). - Tool results carry Snipe-IT data, including personal data of users (names, e-mail addresses, employee numbers), to the MCP client and its model provider.
SNIPEIT_REDACT_PII=truemasks those fields; seeSECURITY.md. - Tool results can also carry secrets that Snipe-IT stores in custom fields (recovery keys, local admin passwords).
SNIPEIT_REDACT_SECRETS=truemasks secret-named fields and secret custom field values in tool results and resources; seeSECURITY.md. - Every request is pinned to the
SNIPEIT_API_BASEorigin and path; redirects are never followed (any 3xx becomes a tool error naming the status andLocation), so a misconfigured base URL (for examplehttp://behind an HTTPS redirect) fails loudly instead of turning a write into a silent GET. - All log output goes to
stderronly;stdoutis reserved for the MCP protocol. - If your token has ever been pasted into a chat or commit, rotate it.
License
MIT (see LICENSE). The vendored Snipe-IT API description is not covered by it; see NOTICE.
來源:README.md,提交 ac547ab
工具
0版本歷史
1- v0.2.2最新Oct 29, 2026
評分
已滿足適用檢查項的 50%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通25 分
請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。
- 已宣告認證方式10 分
請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。
- 已列出工具15 分
請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分