Snipe-IT (unofficial) について
Snipe-IT (unofficial) は、Snipe-IT REST API を通じてデータを管理する stdio 対応 MCP サーバーです。API 仕様から生成したツールに一般的なワークフロー用ラッパーを加え、MCP リソース、プロンプト、書き込み保護機能も備えています。
主な機能
- 01REST API 操作ごとの生成ツール
- 02一般的なワークフロー用ラッパー
- 03資産、ユーザー、ライセンスの操作
- 04MCP リソースとプロンプト
- 05書き込み確認とデータ秘匿の設定
活用シーン
- 01資産と割り当て状況の確認
- 02ハードウェアやライセンスシートの貸出・返却
- 03必要に応じた個人情報や秘密のマスキング
MCP 対応
stdio 経由で MCP クライアントに Snipe-IT REST API のツールを提供し、MCP リソースとプロンプトも公開します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y the-real-snipeit-mcpSNIPEIT_API_BASESnipe-IT API base URL including /api/v1, for example https://snipe-it.example.com/api/v1. Use https.SNIPEIT_API_TOKENシークレットSnipe-IT Personal API Token (JWT), from Snipe-IT > User > Manage API Keys. It acts with the rights of its user.SNIPEIT_CONFIRM_WRITESWrite guard, on by default: write tools return a preview until called again with confirm: "YES". Only false, 0, no or off disable it.SNIPEIT_TIMEOUT_MSTimeout in ms per HTTP attempt, including the body read (positive integer).SNIPEIT_LOG_LEVELLog level on stderr: debug, info, warn or error.SNIPEIT_MAX_RESULT_BYTESCap for one tool result in bytes (serialized JSON), minimum 65536. Larger results come back shortened with truncated: true.SNIPEIT_CALL_DEADLINE_MSOverall deadline for one tool call in ms, across retries and all: true pagination. 0 means none.SNIPEIT_REDACT_PIItrue masks personal data (email, username, names of people, phone, address, employee number) in tool results.SNIPEIT_REDACT_SECRETSシークレットtrue masks secrets (password/secret/token/api_key fields, secret custom field values) in tool results with (redacted).SNIPEIT_READ_ONLYtrue refuses every write at runtime; all tools stay registered and reads work.SNIPEIT_REQUIRE_PREVIEWtrue (with the write guard on): confirm: "YES" executes only after a preview of the same request.ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
the-real-snipeit-mcp
Snipe-IT REST API 用の非公式 MCP サーバーです。ベンダー提供の Snipe-IT OpenAPI 3.1 仕様に含まれる各操作(読み取りと書き込み)に対応する生成ツールに加え、よく使われるワークフロー向けの手書きラッパーと、stdio トランスポートを備えています。
非公式であり、Snipe-IT/Grokability とは関係ありません。 このプロジェクトは、Grokability, Inc. または Snipe-IT プロジェクトと提携、承認、後援、サポートのいずれも受けていません。「Snipe-IT」はその所有者の商標です。ベンダー提供の API 記述とそのライセンス状況については、NOTICE に記載しています。
3 層のツール(183 個):
- 手書きラッパー 37 個(
snipeit_*):よく使われるワークフローをより使いやすくします - 生成ツール 145 個(
snipeit_gen_*):ベンダー提供の仕様(vendor/snipe-it-rest-api.json、Snipe-IT 8.2.0)の各操作に 1 つずつ対応します snipeit_raw_request:SNIPEIT_API_BASE配下の任意のメソッドとパスに対するエスケープハッチです
さらに、リソース 3 個とプロンプト 3 個があります。各数は tests/unit/docsFacts.test.ts で管理されています。
メンテナンス状況
- 1 人のメンテナー(@mguttmann)が、空き時間にベストエフォートでメンテナンスしています。作者は非公開 MCP ゲートウェイの背後で本番運用しています。サポート契約はなく、応答時間も保証されません。
- セキュリティ修正を機能追加より優先します。脆弱性は GitHub の非公開脆弱性報告を通じて非公開で報告してください。公開 issue では報告しないでください(
SECURITY.mdを参照)。 - 依存関係の更新には Dependabot を使用しています。実行時依存関係に既知の高または重大なアドバイザリがある場合、CI は失敗します。
- サポート対象の Node.js バージョン:22.12 以降(
package.jsonのengines)。CI では Node 22、24、26 をテストします。 - 修正対象となるのは最新のマイナーリリースのみです。リリースとその変更内容については、
CHANGELOG.mdを参照してください。 - issue とプルリクエストを歓迎します。詳細は
CONTRIBUTING.mdを参照してください。
インストール
Node.js 22.12 以降が必要です。サーバーには SNIPEIT_API_BASE(/api/v1 を含む、ご利用のインスタンス)と SNIPEIT_API_TOKEN が必要です。それ以外の変数はすべて任意です(設定を参照)。このプロジェクトに該当するのは、npm パッケージ the-real-snipeit-mcp と MCP Registry 名 io.github.mguttmann/the-real-snipeit-mcp のみです。
npx(stdio MCP ホスト全般)
npx がパッケージを取得して実行するため、クローンやビルドは不要です。Claude Code に接続します(トークンはチャットではなく、シェルに入力してください)。
claude mcp add snipeit \
-e SNIPEIT_API_BASE=https://snipe-it.example.com/api/v1 \
-e SNIPEIT_API_TOKEN=<token> \
-- npx -y the-real-snipeit-mcp
その他の stdio ホストも、JSON 設定で同じコマンドを指定します(Claude Desktop の場合は claude_desktop_config.json)。
{
"mcpServers": {
"snipeit": {
"command": "npx",
"args": ["-y", "the-real-snipeit-mcp"],
"env": {
"SNIPEIT_API_BASE": "https://snipe-it.example.com/api/v1",
"SNIPEIT_API_TOKEN": "<token>"
}
}
}
}
これらの値を含む設定ファイルにはトークンが保存されます。自分のユーザーだけが読み取れるようにし、バージョン管理の対象に含めないでください。the-real-snipeit-mcp@<version> でバージョンを固定します。
グローバルインストール
npm install -g the-real-snipeit-mcp
コマンドは the-real-snipeit-mcp です。上記のホスト設定で "command" として使用してください(args は不要です)。
ソースからインストール
git clone https://github.com/mguttmann/the-real-snipeit-mcp.git
cd the-real-snipeit-mcp
npm ci
cp .env.example .env
# edit .env: set SNIPEIT_API_BASE and SNIPEIT_API_TOKEN
npm run build # prebuild runs lint, typecheck and the unit tests first
node --env-file=.env dist/index.js
npm run inspector を実行すると、ビルド済みサーバーに対して MCP Inspector が起動します。
ゲートウェイおよびサーバー向けのバージョン固定インストール
無人運用のホストでは、コミット済みのロックファイルを使用して正確なバージョンをインストールしてください。インストールスクリプトと開発用依存関係は除外し、レジストリの署名と来歴アテステーションを確認してください。
mkdir snipeit-mcp && cd snipeit-mcp
npm init -y
npm install --save-exact --ignore-scripts the-real-snipeit-mcp@<version> # once; commit package.json and package-lock.json
# on every deploy:
npm ci --omit=dev --ignore-scripts
npm audit signatures
node --env-file=/path/to/.env node_modules/the-real-snipeit-mcp/dist/index.js
GitHub Releases の各リリースには、npm の tarball、CycloneDX SBOM、SHA256SUMS が含まれています。リリースワークフローで公開されたリリースには、npm の来歴ステートメントと GitHub のビルド来歴アテステーションが付属します。
MCP Registry と Glama
各安定版リリースは、公式の MCP Registry に io.github.mguttmann/the-real-snipeit-mcp(環境変数を含む npm パッケージ)として登録されています。glama.json には、Glama の掲載情報のメンテナーが記載されています。
設定
| 変数 | デフォルト | 説明 |
|---|---|---|
SNIPEIT_API_TOKEN | (必須) | Snipe-IT の個人用 API トークン(JWT) |
SNIPEIT_API_BASE | https://snipe-it.example.com/api/v1 | API のベース URL です。デフォルトは RFC 2606 のプレースホルダーです。ご利用のインスタンスを設定してください。サーバーは有効な URL であれば起動しますが、プレースホルダーが使用されている場合、http の接続先がループバック以外のホストの場合(トークンが平文で送信されます)、その他のスキームの場合、URL に認証情報が含まれている場合、クエリまたはフラグメントが含まれている場合は警告をログに記録します |
SNIPEIT_CONFIRM_WRITES | true | 有効(デフォルト)の場合、破壊的なツールには confirm: "YES" が必要です。ガードを無効にするのは false、0、no、off(大文字・小文字を問いません)のみです。空または認識されない値の場合は有効のままとなり、警告がログに記録されます。有効な状態は起動時に stderr にログ出力されます |
SNIPEIT_TIMEOUT_MS | 30000 | 試行ごとのタイムアウト(ミリ秒、正の整数)です。レスポンスヘッダーの受信と本文全体の読み取りが対象です |
SNIPEIT_LOG_LEVEL | info | debug | info | warn | error |
SNIPEIT_MAX_RESULT_BYTES | 1048576 (1 MiB) | 1 回のツール結果(シリアライズされた JSON)の上限(バイト単位)です。最小値は 65536 です。8 MiB を超える値を指定すると警告がログに記録されます。TypeScript SDK クライアントが 1 メッセージあたり読み取るのは最大 10 MiB です。上限を超える結果は、切り詰めマーカーを付けた有効な JSON に短縮されます(大きな結果とバイナリ結果を参照)。1 つの HTTP レスポンス本文がバッファーされるサイズは、16 MiB とこの値の 4 倍のうち大きい方を超えません。 |
SNIPEIT_CALL_DEADLINE_MS | 0 (なし) | 1 回のツール呼び出しに対する全体の期限(ミリ秒)です。リトライ、バックオフ、all: true のページネーションを含みます。0 で無効になります。期限を過ぎた呼び出しは DEADLINE_EXCEEDED ツールエラーで終了します。all: true の場合は、収集済みの行を truncated: true および next_offset とともに返します |
SNIPEIT_REDACT_PII | false | ツールの結果とリソースの読み取りで個人データを (redacted) にマスキングします(エラーテキストと書き込みプレビューは対象外)。対象は、あらゆる階層の email、employee_num(ber)、phone、mobile、address、address2、username、first_name、last_name、および人物を表すオブジェクトの name です。資産、モデル、ロケーションの名前はマスキングされません。true/false(または 1/0、yes/no、on/off)を指定できます。認識されない値の場合は有効になり、警告がログに記録されます |
SNIPEIT_REDACT_SECRETS | false | ツールの結果とリソース内のシークレットを (redacted) にマスキングします。対象は、あらゆる階層で名前が password|secret|token|api[_-]?key に一致するすべてのキーの値、および表示名またはデータベース列(_snipeit_*。書き込みレスポンス内のフラットキーも対象)が passw|kennw|secret|token|key|recovery|bitlocker|pin|laps に一致するすべての custom_fields エントリー(オブジェクト形式または配列形式)の value です(大文字・小文字を問いません。意図的に広く指定しているため、「Keyboard layout」もマスキングされます)。また、各 log_meta エントリー(アクションログ、/reports/activity)の old と new、および名前または列がいずれかのルールに一致するすべてのカスタムフィールド定義の default_value も対象です。null と空の値はそのままです。これらの JSON フィールドを含むエラーテキストもマスキングされます。受け付ける値は SNIPEIT_REDACT_PII と同じです。認識されない値の場合は有効になり、警告がログに記録されます。書き込みツールは、本文にプレースホルダーが含まれる場合、常に拒否します(書き込みの安全性を参照) |
SNIPEIT_READ_ONLY | false | 実行時にすべての書き込みを拒否し、READ_ONLY ツールエラーを返します。すべてのツールは登録されたままで、読み取りは可能です。受け付ける値は SNIPEIT_REDACT_PII と同じです。認識されない値の場合は有効になります |
SNIPEIT_REQUIRE_PREVIEW | false | 書き込みガードが有効な場合、confirm: "YES" の実行には、過去 10 分以内に同一のリクエストをプレビューしている必要があります。各プレビューは 1 回のみ使用できます。無効の場合、confirm: "YES" は最初の呼び出しで実行されます。受け付ける値は SNIPEIT_REDACT_PII と同じです |
変数は、環境、node --env-file=<file>、または作業ディレクトリ内の .env(もしくは DOTENV_CONFIG_PATH)から読み込まれます。すでに設定されている変数が上書きされることはありません。.env から追加された変数は、値ではなく名前のみが起動時に stderr にログ出力されます。
ツールリファレンス
ハンドラーツール(37 個)
ID(1)
| ツール | エンドポイント | 注釈 |
|---|---|---|
snipeit_me | GET /users/me | readOnly |
ハードウェア/資産(13)
| ツール | エンドポイント | 注釈 |
|---|---|---|
snipeit_list_hardware | GET /hardware(ページネーション対応、一般的なフィルター) | readOnly |
snipeit_search_hardware | GET /hardware?search={query}(簡易検索) | readOnly |
snipeit_get_hardware_by_id | GET /hardware/{id} | readOnly |
snipeit_get_hardware_by_tag | GET /hardware/bytag/{tag} | readOnly |
snipeit_get_hardware_by_serial | GET /hardware/byserial/{serial} | readOnly |
snipeit_create_hardware | POST /hardware | writeOnce |
snipeit_update_hardware | PATCH /hardware/{id} | writeIdempotent |
snipeit_delete_hardware | DELETE /hardware/{id}(ソフト削除。snipeit_gen_hardwareidrestore で復元) | writeIdempotent |
snipeit_checkout_hardware | POST /hardware/{id}/checkout(ユーザー/ロケーション/資産) | writeOnce |
snipeit_checkin_hardware | POST /hardware/{id}/checkin | writeOnce |
snipeit_audit_hardware | POST /hardware/audit | writeOnce |
snipeit_list_audit_due | GET /hardware/audit/due | readOnly |
snipeit_list_audit_overdue | GET /hardware/audit/overdue | readOnly |
ユーザー(5)
| ツール | エンドポイント | 注釈 |
|---|---|---|
snipeit_list_users | GET /users | readOnly |
snipeit_get_user | GET /users/{id} | readOnly |
snipeit_get_user_assets | GET /users/{id}/assets | readOnly |
snipeit_get_user_accessories | GET /users/{id}/accessories | readOnly |
snipeit_get_user_licenses | GET /users/{id}/licenses | readOnly |
ライセンス(3)
| ツール | エンドポイント | 注釈 |
|---|---|---|
snipeit_list_licenses | GET /licenses | readOnly |
snipeit_get_license_seats | GET /licenses/{id}/seats | readOnly |
snipeit_checkout_license_seat | PUT /licenses/{license_id}/seats/{seat_id} | writeIdempotent |
アクセサリー/消耗品/コンポーネント(8)
| ツール | エンドポイント | 注釈 |
|---|---|---|
snipeit_list_accessories | GET /accessories | readOnly |
snipeit_checkout_accessory | POST /accessories/{id}/checkout | writeOnce |
snipeit_checkin_accessory | POST /accessories/{id}/checkin(pivot-id) | writeOnce |
snipeit_list_consumables | GET /consumables | readOnly |
snipeit_checkout_consumable | POST /consumables/{id}/checkout | writeOnce |
snipeit_list_components | GET /components | readOnly |
snipeit_checkout_component | POST /components/{id}/checkout(資産へ) | writeOnce |
snipeit_checkin_component | POST /components/{id}/checkin(pivot-id) | writeOnce |
ロケーション/ステータスラベル/メンテナンス(6)
| ツール | エンドポイント | 注釈 |
|---|---|---|
snipeit_list_locations | GET /locations | readOnly |
snipeit_get_location | GET /locations/{id} | readOnly |
snipeit_list_statuslabels | GET /statuslabels | readOnly |
snipeit_get_statuslabel_assets | GET /statuslabels/{id}/assetlist | readOnly |
snipeit_list_maintenances | GET /maintenances | readOnly |
snipeit_create_maintenance | POST /maintenances | writeOnce |
一括操作(1)
| ツール | 動作 | 注釈 |
|---|---|---|
snipeit_bulk_checkout | 最大 100 件の資産を順番に貸し出し、項目ごとの成功/エラーの概要を返します。キャンセル時は次の項目の処理前に停止し、aborted と not_attempted を報告します。実行した各項目(asset_id、結果、HTTP ステータス)を stderr に記録します | writeOnce |
一覧ツール(snipeit_list_*)は limit?、offset?、all?: boolean を受け付けます。all: true の場合、最大 10 000 行まで、または結果が SNIPEIT_MAX_RESULT_BYTES を超えるまで自動でページネーションします。その場合、収集済みの行を truncated: true、next_offset、total とともに返し、limit/offset を指定して続行できます。
自動生成されたツール(snipeit_gen_*)
ベンダー管理されている Snipe-IT OpenAPI 3.1 仕様の各操作(パスとメソッド)は、snipeit_gen_<snake_operation_id> として公開されます。各タイトルは METHOD /path で、各説明は仕様に記載された操作の説明に続く METHOD /path: で始まります。ファイルアップロード操作のうち 2 つ(POST /hardware/{id}/files、POST /models/{id}/files)はアップロードできません。ベンダー管理されている仕様では JSON ボディが宣言されていますが、Snipe-IT は multipart/form-data を想定しているためです。説明にもその旨が記載されています。ハンドラーレイヤーで必要な機能がカバーされていない場合に、これらを使用してください。GET ツールには readOnlyHint: true が設定され、その他のメソッドには destructiveHint: true が設定されて書き込みガードが適用されます。npm run refresh-spec の後に npm run codegen を実行して再生成してください。
snipeit_raw_request
その他の操作に使うエスケープハッチです:
{ method: "PATCH", path: "/locations/4", body: { name: "HQ" } }
すべてのメソッドで、アノテーションは固定です(destructiveHint: true、idempotentHint: false)。GET リクエストは書き込みガードを回避しますが、その他のメソッドには SNIPEIT_CONFIRM_WRITES が適用されます。パスは単一の / で始まる必要があります。絶対 URL と、SNIPEIT_API_BASE の範囲外に出るパスは拒否されます。
リソース
| URI | 説明 |
|---|---|
snipeit://me | 現在認証されているユーザー(GET /users/me) |
snipeit://settings | サーバー設定(GET /settings)。このエンドポイントはベンダー管理されている 8.2.0 の仕様には含まれていません。インスタンスがこのエンドポイントを提供していない場合、リソースは読み取りに失敗する代わりに {error, note} を返します |
snipeit://hardware/summary | {total, by_status_label, by_category}:集計された件数。一度に最大 6 件の件数リクエストを実行します。失敗した件数(たとえば API のスロットリングによるもの)は -1 となり、その場合、結果には partial: true と errors[] が含まれます |
プロンプト
| プロンプト | 引数 | 目的 |
|---|---|---|
snipeit-inventory-audit | なし | 期限超過/期限間近の監査と未割り当ての資産を一覧表示し、その後に要約します |
snipeit-user-onboarding | user_id、任意の kit | 新しいユーザー向けの貸し出し手順を提案します |
snipeit-license-health | なし | シートの使用状況と、90 日以内に期限切れとなるライセンスを表示します |
ワークフロー/レシピ
ノート PC を使って新しいユーザーをオンボーディングする
- ユーザーを確認します:
snipeit_get_user(id: 42) - 利用可能なノート PC を探します:
snipeit_list_hardware(category_id: 3, status_id: 5)(配備可能) - 貸し出します:
snipeit_checkout_hardware(id: 100, checkout_to_type: "user", assigned_user: 42, note: "Onboarding 2026-05-25")
キットを 1 人のユーザーに一括で貸し出す
{
"items": [
{ "asset_id": 100, "checkout_to_type": "user", "assigned_user": 42 },
{ "asset_id": 101, "checkout_to_type": "user", "assigned_user": 42 },
{ "asset_id": 102, "checkout_to_type": "user", "assigned_user": 42 }
]
}
アイテムごとのエラーが発生しても処理を続けます。{summary: {total, ok, errors}, results: [...]} を返します。
期限超過の監査を整理する
snipeit_list_audit_overdue(all: true):全件を取得し、自動でページネーションします- 各項目に対して:
snipeit_audit_hardware(asset_tag: "...", location_id: 1, next_audit_date: "2027-05-25")
タグまたはシリアル番号で資産を探す
- 資産タグで検索:
snipeit_get_hardware_by_tag(tag: "A-42")(URL エンコーディングを処理します) - シリアル番号で検索:
snipeit_get_hardware_by_serial(serial: "SN12345")
LLM で何ができるかを調べる
MCP Inspector を確認します:
npm run build && npm run inspector
書き込みの安全性
書き込みガードはデフォルトで有効です。destructiveHint: true のツールはすべて、実行する代わりに秘匿化されたプレビューを返します。実行するには、confirm: "YES" を指定して再度呼び出してください。プレビューには、ツール名、メソッド、URL、クエリパラメーター、秘匿化された本文(password/secret/token/api_key フィールドを (redacted) に置き換えたもの)が表示されます。snipeit_bulk_checkout では、個々の具体的なリクエストが一覧表示されます。プレビューはエラーではなく、通常の結果です。テキストには status: "preview" が含まれ、_meta には "snipeit/preview": true が含まれるため、クライアントは解析せずに、実行済みの書き込みと区別できます。すべての書き込みツールは完全な URL(SNIPEIT_API_BASE + パス)を表示します。
SNIPEIT_CONFIRM_WRITES を false、0、no、または off に設定した場合に限り(前後の空白は除去され、大文字と小文字は区別されません)、ガードが無効になり、書き込みツールが直接実行されます。未設定、true/1/yes/on、空の値、またはそれ以外の値では有効のままです。空の値または認識されない値の場合は、警告もログに記録されます。有効な設定状態は、起動時に一度だけ stderr に記録されます。
confirm はモデルによって設定されるため、ガードはモデルが設定を忘れた場合には検出できますが、Snipe-IT のデータに追加されたプロンプトインジェクションによって設定された場合は検出できません。人間による承認は、MCP ホストまたはゲートウェイが行う必要があります。サーバー側で安全性をさらに高めるため、次のオプションを設定できます。
SNIPEIT_READ_ONLY=trueはすべての書き込みをREAD_ONLYツールエラーで拒否します。すべてのツールは登録されたまま(ツール一覧は変わりません)で、snipeit_raw_requestの GET を含め、読み取りは可能です。SNIPEIT_REQUIRE_PREVIEW=trueは(ガードが有効な場合)、直近10分以内に同一リクエストのプレビューがあり、そのプレビューがまだ使用されていない場合に限り、confirm: "YES"を実行します。つまり、すべての書き込みで事前にプレビューが行われます。
これらの設定とは無関係に、すべての書き込みツール(手書きのもの、生成されたもの、snipeit_bulk_checkout、および GET 以外のメソッドを使用する snipeit_raw_request)は、本文またはクエリのオブジェクトと配列のあらゆる階層において、値が正確に (redacted) である場合、そのリクエストを拒否します。これはプレビュー、SNIPEIT_READ_ONLY、リクエストの前に実行されます。拒否時には、details.code: "REDACTED_PLACEHOLDER" と details.paths(例:body.custom_fields["BitLocker Key"].value、body[2].password、items[2].note、query.token)を含むツールエラーが返されます。これにより、秘匿化を有効にした状態で読み取ったアセットを変更せずに書き戻しても、復旧キーがプレースホルダーで上書きされることはありません。(redacted) を一部に含むだけの文字列は、従来どおり送信されます。実際の値を設定するか、そのフィールドを省略してください。
各プレビュー、拒否、確認済みの実行では、情報ログが1行記録されます(ツール、メソッド、URL)。また、実行された書き込みリクエストでは、HTTP ステータスを含む情報ログが1行記録されます(クエリや本文は記録されません)。
Snipe-IT API の特性
Snipe-IT は、検証エラーに対して {"status":"error","messages":…} を含む HTTP 200 を返すことがよくあります。このサーバーはこの形式を検出し、メッセージをツールエラー(isError: true を含む)として返すため、呼び出し元が Snipe-IT のエラーを誤って成功として扱うことはありません。成功を示す形式({"status":"success","payload":…})は自動的にラップ解除されるため、ツールデータには外側のラッパーではなく内側の payload が含まれます。
大容量およびバイナリーの結果
- サイズ上限。 各ツールの結果は
SNIPEIT_MAX_RESULT_BYTES(デフォルトは 1 MiB)に制限されます。リスト({total, rows})では、収まる範囲で先頭の行が保持され、truncated: trueとnext_offsetが追加されます。ページネーションのヒントもそれに合わせて調整されます。トップレベルの配列では、先頭の項目が保持され、dataの隣にtruncatedオブジェクトが追加されます。それ以外のサイズ超過した結果は{truncated: true, size_bytes, max_result_bytes, note}に置き換えられます。出力は常に有効な JSON であり、文字列が途中で切れることはありません。 - 本文の読み取り上限。 1 回の HTTP レスポンス本文の読み取り上限は、16 MiB と
SNIPEIT_MAX_RESULT_BYTESの 4 倍のうち大きい方です。それを超える JSON またはテキスト本文は、バッファーに読み込まれず、RESPONSE_TOO_LARGEツールエラーになります。 - バイナリーダウンロード。 コンテンツタイプが JSON、XML、
text/*のいずれでもないレスポンス(バックアップの zip、アップロード済みファイル、画像、PDF など)はデコードされません。ツールは{binary: true, content_type, size_bytes, size_exact, filename, note}を返します。内容が必要な場合は、Snipe-IT から直接ファイルをダウンロードしてください。 - タイムアウト、再試行、リダイレクト。
SNIPEIT_TIMEOUT_MSは本文の読み取りを含む各試行に適用されます。429 は常に再試行されます。5xx とネットワークエラーは、冪等なメソッド(GET、PUT、DELETE)の場合のみ再試行されます。POST と PATCH は、接続が確立されなかった場合(ECONNREFUSED、ENOTFOUND、EAI_AGAIN)に限り再試行されるため、書き込みが二重に送信されることはありません。リダイレクトは一切追跡されません。キャンセルされたツール呼び出し(MCP によるキャンセル、またはクライアントの切断)があると、HTTP リクエストと再試行の待機は直ちに中止されます。SNIPEIT_CALL_DEADLINE_MSを設定すると、呼び出し全体の時間に上限を設けられます。
開発
npm run dev # tsx watch
npm test # unit; live tests only with SNIPEIT_LIVE_TESTS=1
npm run test:contract # gateway tool contract + protocol revisions
npm run test:unit # unit only (CI-safe)
SNIPEIT_LIVE_TESTS=1 npm run test:integration # live; also needs SNIPEIT_API_TOKEN
npm run lint
npm run typecheck
npm run codegen # regenerate src/tools/generated from vendor/snipe-it-rest-api.json
npm run refresh-spec # pull latest OpenAPI spec from snipe-it.readme.io
npm run inspector # MCP Inspector
レイヤー図とデータフローについては ARCHITECTURE.md を参照してください。手書きのラッパーの追加、コード生成レイヤーの再生成、デバッグについては CONTRIBUTING.md を参照してください。
セキュリティ
- API トークンは
SNIPEIT_API_TOKEN環境変数からのみ読み込まれます。ハードコードしないでください。.envは git の追跡対象外です。 - バージョン 0.1.7 以前では、絶対 URL を指定した
snipeit_raw_requestにより、トークンが別のホストへ送信される可能性があります。0.2.0 以降にアップグレードしてください(CHANGELOG.mdを参照)。 - ロガーとモデルに返されるすべてのエラーテキストでは、既知のシークレットパターン(Bearer トークン、JWT、あらゆるスキームの
Authorizationヘッダー、api_token/password/secret/token/api_keyフィールドとクエリパラメーター、URL のユーザー情報)がマスキングされます。 - ツールの結果には、ユーザーの個人データ(氏名、メールアドレス、従業員番号など)を含む Snipe-IT のデータが含まれ、MCP クライアントとそのモデルプロバイダーに送信されます。
SNIPEIT_REDACT_PII=trueに設定すると、これらのフィールドがマスキングされます。詳しくはSECURITY.mdを参照してください。 - ツールの結果には、Snipe-IT がカスタムフィールドに保存しているシークレット(復旧キー、ローカル管理者パスワードなど)が含まれる場合もあります。
SNIPEIT_REDACT_SECRETS=trueに設定すると、ツールの結果とリソースに含まれる、シークレットを示す名前のフィールドとシークレットのカスタムフィールド値がマスキングされます。詳しくはSECURITY.mdを参照してください。 - すべてのリクエストは
SNIPEIT_API_BASEのオリジンとパスに固定されます。リダイレクトは一切追跡されません(すべての 3xx は、ステータスとLocationを示すツールエラーになります)。そのため、ベース URL の設定ミス(HTTPS リダイレクトの背後でhttp://を指定するなど)は、書き込みが気づかないうちに GET に変わることなく、明示的にエラーになります。 - ログ出力はすべて
stderrのみに出力されます。stdoutは MCP プロトコル専用です。 - トークンをチャットやコミットに貼り付けたことがある場合は、ローテーションしてください。
ライセンス
MIT(LICENSE を参照)。ベンダー提供の Snipe-IT API の記述はこのライセンスの対象外です。詳しくは NOTICE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。