Skip to main content
Glama
Snipe-IT MCP Server

Snipe-IT MCP Server

by jameshgordy

Snipe-IT MCP Server

A comprehensive Model Context Protocol (MCP) server for managing Snipe-IT inventory systems. This server enables AI assistants to perform full CRUD operations across your entire Snipe-IT instance with 40 tools covering all major API endpoints, plus 2 optional data-quality tools that use a judgment model — TypeSafe Jev, a self-hosted open-weight System One model such as Laya, or an OpenAI-compatible chat model via Ollama — for duplicate detection and record matching.

Features

Asset Management

  • Full CRUD Operations: Create, read, update, delete, and search assets with enhanced filtering

  • Barcode/Serial Lookup: Direct bytag/byserial API endpoints for reliable barcode scanning

  • Asset Operations: Checkout, checkin, audit, and restore assets

  • Checkout Requests: Submit and cancel checkout requests for requestable assets

  • File Attachments: Upload, download, list, and delete asset files

  • Label Generation: Generate printable PDF labels

  • Maintenance Tracking: Create and manage maintenance records

  • License Associations: View licenses assigned to assets

Inventory Tracking

  • Consumables: Complete management of consumable items

  • Components: Manage components with checkout/checkin to assets

  • Accessories: Track accessories with checkout/checkin to users, assets, or locations

Users & Organization

  • Users: Full user management including restore and current user endpoint

  • User Assets: View all items checked out to a user (assets, accessories, licenses, consumables, EULAs)

  • Two-Factor Auth: Reset user 2FA (admin function)

  • Companies: Multi-tenant company management

  • Departments: Organizational department management

  • Groups: Permission group management

System Configuration

  • Categories: Manage categories for all item types

  • Manufacturers: Track manufacturer information

  • Models: Define asset models with depreciation, custom fields, and file attachments

  • Status Labels: Configure asset statuses with asset listing

  • Locations: Manage physical locations with hierarchy, asset/user queries

  • Suppliers: Track supplier information

  • Depreciations: Define depreciation schedules

Custom Fields

  • Fields: Create and manage custom field definitions

  • Fieldsets: Group custom fields for assignment to models with field reordering

  • Field Association: Associate/disassociate fields with fieldsets

Licensing

  • License Management: Full CRUD for software licenses

  • Seat Assignments: Checkout/checkin license seats

  • License Files: Manage license documentation

Reporting & Auditing

  • Activity Logs: Query all activity history

  • Item Activity: Get activity for specific items

  • Status Summary: Asset counts grouped by status label

  • Audit Tracking: Track assets due/overdue for audit

Data Quality (optional, judgment-model backed)

  • Duplicate Detection: Find likely duplicate manufacturers, models, suppliers, locations, categories, companies, or departments — judged pairwise with a confidence per pair

  • Record Matching: Resolve free-text names (CSV cells, spoken descriptions) to existing record IDs, with an explicit "none" abstention

  • Bring your own model: TypeSafe Jev (hosted), any self-hosted server speaking the System One protocol (Laya, CLM, …), or any OpenAI-compatible chat server (Ollama, vLLM, LM Studio, …)

  • Enabled only when a backend is configured; see Optional — judgment backend for the data-quality tools

Import & System Administration

  • CSV Imports: Full import workflow (upload, map columns, process)

  • System Info: Get Snipe-IT version information

  • Backups: List and download database backups

  • LDAP Operations: LDAP sync and connection testing

Related MCP server: Freshservice MCP Server

Requirements

  • Python 3.11+

  • UV package manager

  • Snipe-IT instance with API access

  • API token with appropriate permissions

Installation

1. Clone the repository

git clone https://github.com/jameshgordy/snipeit-mcp.git
cd snipeit-mcp

2. Install dependencies

uv sync

3. Configure environment variables

The server supports two authentication modes; pick one.

Mode A — API key (stdio or HTTP, single shared identity)

Create a .env file:

SNIPEIT_URL=https://your-snipeit-instance.com
SNIPEIT_TOKEN=your-api-token-here
SNIPEIT_ALLOWED_TOOLS=manage_assets,system_info  # Optional: restrict exposed tools

Variable

Required

Description

SNIPEIT_URL

Yes

Your Snipe-IT instance URL

SNIPEIT_TOKEN

Yes

API token for authentication

SNIPEIT_ALLOWED_TOOLS

No

Comma-separated list of tool names to expose. If unset, all tools are available.

Getting an API Token:

  1. Log in to your Snipe-IT instance

  2. Navigate to your user profile (top right menu)

  3. Go to "Manage API Keys" or "Personal Access Tokens"

  4. Generate a new token with required permissions

Mode B — Interactive OAuth login (HTTP only, per-user identity)

In this mode the MCP server runs as a web service and acts as an OAuth proxy in front of Snipe-IT's built-in Laravel Passport provider. Each user logs in to Snipe-IT (going through your normal SAML / SSO if configured) and the MCP server uses that user's own access token for every tool call.

One-time Snipe-IT setup (admin):

  1. Visit https://your-snipeit-instance.com/admin/oauth

  2. Create a new OAuth client

  3. Set the redirect URI to https://your-mcp-public-url/auth/callback

  4. Note the generated client ID and secret

Environment variables:

SNIPEIT_URL=https://your-snipeit-instance.com
SNIPEIT_OAUTH_CLIENT_ID=...                  # from /admin/oauth
SNIPEIT_OAUTH_CLIENT_SECRET=...              # from /admin/oauth
SNIPEIT_MCP_BASE_URL=https://your-mcp-public-url
MCP_TRANSPORT=http
MCP_PORT=8000
# MCP_HOST=0.0.0.0                            # defaults to 127.0.0.1

Variable

Required

Description

SNIPEIT_URL

Yes

Your Snipe-IT instance URL

SNIPEIT_OAUTH_CLIENT_ID

Yes

OAuth client ID from /admin/oauth

SNIPEIT_OAUTH_CLIENT_SECRET

Yes

OAuth client secret from /admin/oauth

SNIPEIT_MCP_BASE_URL

Yes

Public URL where this MCP server is reachable (used in the OAuth callback)

SNIPEIT_MCP_REDIRECT_PATH

No

Override OAuth callback path (default /auth/callback)

MCP_TRANSPORT

Yes

Must be http for OAuth mode

MCP_HOST

No

Bind address (default 127.0.0.1; use 0.0.0.0 behind a reverse proxy)

MCP_PORT

Yes

TCP port for the HTTP server

LOG_LEVEL

No

DEBUG/INFO/WARNING/ERROR/CRITICAL (default INFO)

NOTE

OAuth mode requires HTTP transport — starting withMCP_TRANSPORT=stdio while OAuth env vars are set fails at startup with a clear error.

Mode C — multi-identity (HTTP, one container, per-user tokens)

In this mode one container serves all people, each still acting under their own Snipe-IT personal access token. Instead of one container per person (each with a private SNIPEIT_TOKEN), every person gets a random MCP token that they put into their own MetaMCP server entry. The server maps MCP token → identity → Snipe-IT PAT per request, so the Snipe-IT activity log shows the correct person for every action, and the container log carries a second, Snipe-IT-independent audit trail.

Mode C requires HTTP transport and is mutually exclusive with OAuth mode (startup fails if both are configured).

Per-person tokens: generate one random token per person, e.g. openssl rand -hex 32. Tokens must be at least 32 characters, unique per person, and different from that person's Snipe-IT PAT (startup validates all of this and exits with a clear error otherwise).

Environment variables:

SNIPEIT_URL=https://your-snipeit-instance.com   # one instance for all
# One block per person (<KEY> matches [A-Z0-9_]+, e.g. STAAT):
SNIPEIT_IDENTITY_STAAT_MCP_TOKEN=...            # required, >= 32 chars, unique
SNIPEIT_IDENTITY_STAAT_SNIPEIT_TOKEN=...        # required, the person's Snipe-IT PAT
SNIPEIT_IDENTITY_STAAT_DISPLAY_NAME=...         # optional, shown in logs
SNIPEIT_IDENTITY_STAAT_ALLOWED_TOOLS=...        # optional CSV, e.g. manage_assets,system_info
SNIPEIT_IDENTITY_STAAT_READ_ONLY=true           # optional, blocks all write actions
# Transport (required for this mode):
MCP_TRANSPORT=http
MCP_PORT=8000
MCP_HOST=127.0.0.1

Variable

Required

Description

SNIPEIT_URL

Yes

Snipe-IT instance URL (shared by all identities)

SNIPEIT_IDENTITY_<KEY>_MCP_TOKEN

Yes

Random bearer token the person uses to authenticate to this MCP server (min 32 chars, unique per person)

SNIPEIT_IDENTITY_<KEY>_SNIPEIT_TOKEN

Yes

That person's Snipe-IT personal access token

SNIPEIT_IDENTITY_<KEY>_DISPLAY_NAME

No

Human-readable name used in log lines (identity keys are logged at startup, never token values)

SNIPEIT_IDENTITY_<KEY>_ALLOWED_TOOLS

No

Comma-separated tool allowlist for that person; enforced at call time and in tools/list

SNIPEIT_IDENTITY_<KEY>_READ_ONLY

No

When true, blocks all write actions (create, update, delete, checkout, checkin, audit, restore, file uploads, imports, LDAP sync, …); read actions stay allowed

SNIPEIT_IDENTITIES_FILE

No

Path to a JSON file with the same fields (list of objects with an explicit key). If set, the file wins and all SNIPEIT_IDENTITY_* env vars are ignored (logged at startup). For secret-mount based environments.

MCP_TRANSPORT

Yes

Must be http

MCP_PORT

Yes

TCP port for the HTTP server

MCP_HOST

No

Bind address (default 127.0.0.1)

LOG_LEVEL

No

DEBUG/INFO/WARNING/ERROR/CRITICAL (default INFO)

MetaMCP configuration — one entry per person: the only difference between the entries is the bearer token; the URL is identical for everyone.

MetaMCP server entry (per person, Ownership: Private)
  Name:         snipeit
  Type:         Streamable HTTP
  URL:          http://snipeit-mcp:8000/mcp        ← identical for all
  Bearer Token: <that person's MCP token>          ← the only difference

How a request is handled:

  1. The HTTP layer checks Authorization: Bearer <mcp_token>. Missing or unknown token → 401 with WWW-Authenticate: Bearer, before any tool runs. Token comparison is constant-time (hmac.compare_digest).

  2. The identity is stored in a request-scoped context variable; the tool call then authenticates to Snipe-IT with that person's PAT.

  3. One JSON audit line per tool call goes to stderr (logger snipeit_mcp.audit): identity, tool, action, outcome, duration, and a SHA-256 digest of the arguments (arguments themselves are never logged, and no token ever appears in logs).

{"ts":"2026-08-26T09:41:02.113456+00:00","identity":"STAAT","tool":"manage_assets","action":"update","ok":true,"duration_ms":142,"args_digest":"9f2c1ab04e6d7731"}

Health endpoint: unauthenticated GET /healthz returns {"status":"ok","identities":<n>} — use it for container healthchecks (see deploy/docker-compose.yml).

WARNING

Known, accepted limitations — read before deploying:

  • The container still holds all people's PATs in environment variables. Whoever can read them (Portainer admin, Docker host access) can impersonate any identity. Per-request attribution becomes robust, but it is not tamper-proof.

  • One container for everyone is a single point of failure for all of them — if it goes down, nobody's Snipe-IT access via MCP works.

  • Bearer-token authentication only protects traffic that stays on the internal Docker network. Do not publish the port to a wider network (the compose file deliberately has no ports: mapping).

  • Only OAuth mode (Mode B) provides cryptographically sound per-user attribution, and it does not fit centrally managed clients like MetaMCP.

Optional — judgment backend for the data-quality tools

The two data-quality tools, find_duplicates and match_records, ask typed questions — "are these two records the same manufacturer?" (a 3-level score), "which of these models does this text refer to?" (a choice with a none option) — and need a model to answer them with a probability per option. They are hidden from tools/list until a backend is configured, so an unconfigured server presents exactly the 40 core tools. They work in every auth mode and are read-only with respect to Snipe-IT.

Backend (JUDGMENT_BACKEND)

Works with

Confidence

Speed / cost

systemone (default)

TypeSafe Jev (hosted, needs a key from console.typesafe.ai); self-hosted open-weight System One models that serve the same POST /v1/systemone protocol — Laya (Apache 2.0, ~400M params), CLM-8B, Rapid-MLX's system-one server, openjev

Calibrated probabilities; the thresholds below are meaningful

~0.1 s per question set; Jev is ~$0.04 per million input tokens, self-hosted is free

openai

Any OpenAI-compatible /chat/completions server with JSON-schema structured outputs: Ollama (≥ 0.5), vLLM, LM Studio, llama.cpp server, OpenRouter, OpenAI

Not calibrated: the model's self-reported confidence, or vote frequency across JUDGMENT_SAMPLES runs

Seconds per question set on a local 8B model; a 100-pair scan is minutes, not seconds

NOTE

Only the hosted TypeSafe API has been exercised for wire-format compatibility (against the official SDK's source). The self-hosted System One servers and the chat backend have been tested against mocked HTTP only — please report what works for you.

TypeSafe Jev (hosted):

TYPESAFE_API_KEY=...                          # the typesafe-sdk variable name is accepted as-is
#TYPESAFE_DEFAULT_MODEL=jev-1.13.0            # pin a version once thresholds are tuned

Self-hosted System One model (e.g. Laya):

JUDGMENT_BACKEND=systemone
JUDGMENT_BASE_URL=http://laya:8080            # must serve POST /v1/systemone
JUDGMENT_MODEL=laya

Ollama (or any OpenAI-compatible server):

JUDGMENT_BACKEND=openai
JUDGMENT_BASE_URL=http://localhost:11434/v1   # Ollama's OpenAI-compatible base (default)
JUDGMENT_MODEL=qwen3:8b                       # any pulled model that follows JSON schemas well
#JUDGMENT_SAMPLES=3                           # optional: vote across 3 samples instead of self-reported confidence
#JUDGMENT_API_KEY=sk-...                      # only for hosted services (OpenRouter, OpenAI, ...)

Variable

Required

Description

JUDGMENT_BACKEND

No

systemone (default) or openai. Setting any JUDGMENT_* / TYPESAFE_* variable enables the tools.

JUDGMENT_BASE_URL

No

Default https://api.typesafe.ai for systemone, http://localhost:11434/v1 for openai. Alias: TYPESAFE_BASE_URL.

JUDGMENT_MODEL

For openai

Default jev-latest for systemone; required for openai (e.g. qwen3:8b). Alias: TYPESAFE_DEFAULT_MODEL. Aliases like jev-latest move with releases; pin a version after tuning thresholds.

JUDGMENT_API_KEY

For hosted services

Sent as Authorization: Bearer. Omit for local servers. Alias: TYPESAFE_API_KEY.

JUDGMENT_TIMEOUT

No

Per-request timeout in seconds (default 10 for systemone, 120 for openai). Retries on 408/429/5xx and transport errors follow the official TypeSafe SDK policy (2 retries, exponential backoff, Retry-After honoured). Alias: TYPESAFE_TIMEOUT.

JUDGMENT_SAMPLES

No

openai only, 1–10 (default 1). Above 1, each question set is asked that many times at a sampling temperature and vote frequency becomes the probability. Multiplies cost and latency.

JUDGMENT_TIME_BUDGET

No

Seconds one tool call may spend on backend calls in total (default 300). Pairs or texts still pending at the deadline are skipped and listed in errors.

WARNING

With a hosted backend, data leaves your network. The projected fields of the scanned records — names, model numbers, addresses, and supplier/company contact URLs, emails and phone numbers — are sent to whatever JUDGMENT_BASE_URL points at. Self-host (Laya, Ollama, …) if that is not acceptable. Users are deliberately not supported by these tools because user records are personal data. For TypeSafe, review their legal terms (zero data retention is an enterprise option). In multi-identity mode, restrict who may call these tools with SNIPEIT_IDENTITY_<KEY>_ALLOWED_TOOLS.

Cost and limits. find_duplicates compares every pair when the table is small (≤ max_pairs pairs) and otherwise pre-filters lexically similar pairs in code (capped at 20 000 comparisons), so backend calls are bounded by max_pairs (default 100, max 500). match_records sends at most candidates_per_text records (default 50, max 254) plus none per text. Both tools report usage token counts and elapsed_seconds, and stop submitting work when JUDGMENT_TIME_BUDGET runs out.

Reading the results. Every judgment carries a confidence (0–1) and a confidence_band: high (≥ 0.9) is safe to act on, medium (0.5–0.9) should be confirmed by a person, low should not be acted on. Every result also says who judged: backend, model, calibrated and confidence_source (model for System One models, self_reported or vote_frequency for chat models). The bands are only meaningful when calibrated is true; with a chat backend treat them as a hint and keep a human in the loop. find_duplicates separates duplicates (judged the same), review (related, possibly the same) and different_count; treat review as a to-check list, never a to-merge list.

Production Deployment

For running the server as a long-lived HTTPS service on a Linux VM (the typical shape for OAuth mode), the repo ships two helper scripts under scripts/:

Script

Purpose

scripts/setup-snipeit-mcp.sh

One-shot installer. Creates a snipeit-mcp service user, installs uv if missing, writes /etc/snipeit-mcp.env (seeding SNIPEIT_* values from a .env at the repo root if present), installs and starts a hardened systemd unit, and probes the local OAuth metadata endpoint. Idempotent.

scripts/update-snipeit-mcp.sh

Routine update — git pull, re-uv sync, restart the service, re-probe.

Quick-start on a fresh VM (assumes Debian/Ubuntu with systemd; needs root):

# 1. Clone the source tree
sudo git clone https://github.com/jameshgordy/snipeit-mcp.git /opt/snipeit-mcp

# 2. (Optional) Drop a .env at the repo root so setup can seed
#    SNIPEIT_URL / SNIPEIT_OAUTH_CLIENT_ID / _SECRET / SNIPEIT_MCP_BASE_URL.
#    Missing values become __FILL_ME__ placeholders in /etc/snipeit-mcp.env.
scp .env you@vm:/tmp/snipeit-seed.env
sudo mv /tmp/snipeit-seed.env /opt/snipeit-mcp/.env

# 3. Install and start
sudo bash /opt/snipeit-mcp/scripts/setup-snipeit-mcp.sh

# 4. Future updates
sudo bash /opt/snipeit-mcp/scripts/update-snipeit-mcp.sh
NOTE

The scripts are committed with the executable bit set, sosudo /opt/snipeit-mcp/scripts/... works once they're checked out via git clone. The sudo bash ... form above is the bullet-proof alternative — it doesn't care about file permissions, useful if you transferred the scripts via scp/drag-and-drop and the bit didn't come along.

What the installer configures:

Path

Purpose

/opt/snipeit-mcp/

Source tree (owned by service user)

/var/lib/snipeit-mcp/

FASTMCP_HOME — DCR'd MCP client registrations persist here

/etc/snipeit-mcp.env

Secrets and deployment-specific URLs (SNIPEIT_* only)

/etc/systemd/system/snipeit-mcp.service

systemd unit; infra settings (MCP_TRANSPORT, MCP_HOST, MCP_PORT, LOG_LEVEL, FASTMCP_HOME) are baked into its Environment= directives

Configurable at install time via environment variables on the setup-snipeit-mcp.sh invocation:

Variable

Default

Notes

SOURCE_DIR

/opt/snipeit-mcp

Source tree path

STATE_DIR

/var/lib/snipeit-mcp

Service-user home / FASTMCP_HOME

ENV_FILE

/etc/snipeit-mcp.env

Generated env file

SEED_ENV_FILE

$SOURCE_DIR/.env

Optional seed for SNIPEIT_* values

MCP_TRANSPORT

http

Always http for OAuth mode

MCP_HOST

127.0.0.1

Bind address. Loopback by default; set MCP_HOST=0.0.0.0 to expose on all interfaces (e.g. a reverse proxy on a different host)

MCP_PORT

8000

TCP port

LOG_LEVEL

INFO

IMPORTANT

The scripts donot configure TLS — the server listens on plain HTTP on the chosen MCP_PORT. For public OAuth use, terminate TLS in front of it (corporate reverse proxy, Caddy, nginx, …) with a trusted certificate for the hostname in SNIPEIT_MCP_BASE_URL.

Exposing a VPN-only Snipe-IT to web-based MCP clients (DMZ reverse proxy)

Web-based MCP clients (Claude.ai, Mistral's Le Chat, …) run their MCP transport through the client vendor's own backend, which needs to reach SNIPEIT_MCP_BASE_URL from the public internet — a VPN-only address won't work. If your Snipe-IT instance itself is VPN-only, the typical shape is to keep the MCP VM internal and put a public-facing reverse proxy in a DMZ in front of it:

Web client backend ──HTTPS──► public reverse proxy (DMZ) ──HTTP──► MCP VM (internal) ──HTTPS──► Snipe-IT (internal)

What the DMZ proxy needs:

  • Public hostname matching SNIPEIT_MCP_BASE_URL (e.g. snipeit.mcp.example.com).

  • Trusted TLS certificate for that hostname — client backends will not accept internal CAs.

  • Upstream: the internal VM on http://<vm-ip>:<MCP_PORT>.

  • Forwarded headers: Host, X-Forwarded-Proto: https, X-Forwarded-Host, X-Forwarded-For. FastMCP uses these to build correct OAuth metadata URLs.

  • Do not strip WWW-Authenticate from upstream responses — MCP clients (Inspector, mcp-remote, web clients) rely on it to discover the OAuth flow. Header-allowlist proxies are a common culprit.

  • Do not add CORS headers — FastMCP handles its own.

NOTE

VPN is still required for the initial Snipe-IT login. The OAuth flow redirects the user's browser to https://<your-snipeit>/oauth/authorize for sign-in (and SSO bounce), which is VPN-only by definition. Once the user has signed in once, subsequent MCP tool calls and refresh-token rotation go client backend → DMZ → MCP VM → Snipe-IT entirely server-side, so users can keep using the web client from anywhere until the refresh token expires or is revoked, at which point a one-time VPN reconnect is needed to re-login.

MCP Client Configuration

The right configuration depends on whether the server runs in API-key mode (stdio, local, one shared identity) or OAuth mode (HTTP, remote, per-user identity). See the previous section for how the server picks between them.

Claude Desktop / Claude Code — API-key mode (stdio)

Add to your MCP configuration file:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json Windows: %APPDATA%\Claude\claude_desktop_config.json

Option A: Install directly from GitHub (no clone required)

{
  "mcpServers": {
    "snipeit": {
      "command": "uvx",
      "args": [
        "--from",
        "git+https://github.com/jameshgordy/snipeit-mcp",
        "snipeit-mcp"
      ],
      "env": {
        "SNIPEIT_URL": "https://your-snipeit-instance.com",
        "SNIPEIT_TOKEN": "your-api-token-here"
      }
    }
  }
}

Option B: Run from a local clone

{
  "mcpServers": {
    "snipeit": {
      "command": "uv",
      "args": [
        "--directory",
        "/path/to/snipeit-mcp",
        "run",
        "snipeit-mcp"
      ],
      "env": {
        "SNIPEIT_URL": "https://your-snipeit-instance.com",
        "SNIPEIT_TOKEN": "your-api-token-here"
      }
    }
  }
}

Claude Desktop / Claude Code — OAuth mode (via mcp-remote)

When the server runs in OAuth mode it speaks HTTP, not stdio, so it cannot be launched directly by Claude Desktop. Use mcp-remote as a stdio bridge — it handles Dynamic Client Registration, opens the browser for interactive login, caches the resulting tokens, and refreshes them transparently. The server must already be running and reachable at the URL below (e.g. on a VM, behind a reverse proxy, or on localhost for dev).

{
  "mcpServers": {
    "snipeit": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://your-mcp-public-url/mcp"
      ]
    }
  }
}
NOTE

NoSNIPEIT_* env vars belong here — the server holds them. The first connection opens a browser tab for Snipe-IT login (going through your SSO if configured); subsequent connections reuse the cached refresh token.

Claude.ai web (OAuth mode only)

Open https://claude.ai → Settings → Connectors → Add custom connector. Paste the public URL of your running MCP server (e.g. https://your-mcp-public-url/mcp) and follow the OAuth prompt.

IMPORTANT

Claude.ai web requires the MCP server to be reachable from the public internet over HTTPS —localhost and unencrypted HTTP do not work here. Use the mcp-remote bridge instead if you only have a localhost deployment.

Cursor

Add to your Cursor MCP settings using the same JSON shape as the Claude Desktop examples above — stdio (API-key) or mcp-remote bridge (OAuth) — whichever matches your server mode.

MCP Inspector (debugging)

npx @modelcontextprotocol/inspector

Then in the Inspector UI:

  • Transport Type: Streamable HTTP

  • URL: your server's /mcp endpoint

  • Connection Type: must be Via Proxy, not Direct

NOTE

Why "Via Proxy"? The Inspector UI is a static frontend served at http://localhost:6274 and the MCP server lives at a different origin (e.g. http://localhost:8000). In Direct mode the browser tries to talk to the MCP server itself, which fails for two compounding reasons: (a) FastMCP doesn't emit CORS headers for the Inspector origin, so requests are blocked client-side, and (b) the OAuth redirect flow needs server-side state the browser-only client can't keep. Via Proxy routes traffic through Inspector's own backend (at localhost:6277), which is same-origin from the MCP server's perspective and handles OAuth state correctly.

WARNING

LeaveClient ID and Client Secret in the OAuth panel empty — Inspector will perform Dynamic Client Registration with the MCP server. Pasting your Snipe-IT (upstream) client_id and secret there is the most common misconfiguration; those credentials belong only in the server's .env, not in any MCP client.

Available Tools (40 core + 2 optional)

Asset Tools (8)

Tool

Description

manage_assets

CRUD operations with bytag/byserial lookup and advanced filtering

asset_operations

State operations (checkout, checkin, audit, restore)

bulk_asset_operations

Bulk edit and bulk audit across many assets at once (Snipe-IT v8.7+)

asset_files

File attachments (upload, list, download, delete)

asset_labels

Generate printable PDF labels

asset_maintenance

Full maintenance lifecycle (create, list, get, update, delete, complete)

asset_licenses

View licenses assigned to an asset

asset_requests

Submit/cancel checkout requests, list own requests and requestable assets

Inventory Tools (5)

Tool

Description

manage_consumables

CRUD operations for consumables

manage_components

CRUD operations for components

component_operations

Checkout/checkin components to assets

manage_accessories

CRUD operations for accessories

accessory_operations

Checkout/checkin accessories to users, assets, or locations

Kit Tools (1)

Tool

Description

manage_kits

CRUD for predefined kits plus kit content management (models, licenses, accessories, consumables)

User & Organization Tools (6)

Tool

Description

manage_users

CRUD operations for users (+ restore, me)

user_assets

Get items checked out to a user (assets, accessories, licenses, consumables, eulas)

user_two_factor

Reset user two-factor authentication

manage_companies

CRUD operations for companies

manage_departments

CRUD operations for departments

manage_groups

CRUD operations for permission groups

Configuration Tools (7)

Tool

Description

manage_categories

Manage categories for all item types

manage_manufacturers

Manage manufacturer information

manage_models

Manage asset models (+ list assets by model)

manage_status_labels

Manage status labels (+ list assets by status)

manage_locations

Manage locations (+ list assets/users by location)

manage_suppliers

Manage supplier information

manage_depreciations

Manage depreciation schedules

Custom Field Tools (2)

Tool

Description

manage_fields

CRUD + associate/disassociate fields with fieldsets

manage_fieldsets

CRUD operations for fieldsets (+ field listing, reorder)

License Tools (3)

Tool

Description

manage_licenses

CRUD operations for licenses

license_seats

Manage license seat assignments

license_files

Manage license file attachments

Reporting & Audit Tools (3)

Tool

Description

activity_reports

Query activity logs and item history

status_summary

Get asset counts grouped by status label

audit_tracking

Track assets due/overdue for audit

Import Tools (1)

Tool

Description

manage_imports

CSV import workflow (upload, then process with type and column mapping)

Data Quality Tools (2, optional — require a judgment backend)

Tool

Description

find_duplicates

Find likely duplicate manufacturers, models, suppliers, locations, categories, companies or departments; pairwise judgments with score, confidence, both records and a merge hint

match_records

Resolve free-text names to existing record ids (or none) with per-option probabilities — for import prep and natural-language asset creation

System Administration Tools (4)

Tool

Description

system_info

Get Snipe-IT version information

manage_backups

List and download database backups

ldap_operations

LDAP sync and connection testing

model_files

Manage file attachments for asset models

Usage Examples

Create an Asset

{
  "action": "create",
  "asset_data": {
    "status_id": 1,
    "model_id": 5,
    "asset_tag": "LAP-001",
    "name": "MacBook Pro 14",
    "serial": "C02X12345"
  }
}

Create a User

{
  "action": "create",
  "user_data": {
    "first_name": "John",
    "last_name": "Doe",
    "username": "jdoe",
    "email": "jdoe@example.com",
    "password": "securepassword",
    "password_confirmation": "securepassword",
    "department_id": 1
  }
}

Get Items Checked Out to User

{
  "user_id": 123,
  "asset_type": "all"
}

Checkout Component to Asset

{
  "action": "checkout",
  "component_id": 45,
  "checkout_data": {
    "assigned_to": 123,
    "assigned_qty": 2,
    "note": "RAM upgrade"
  }
}

Query Activity Logs

{
  "action": "list",
  "action_type": "checkout",
  "limit": 50
}

Create Custom Field

{
  "action": "create",
  "field_data": {
    "name": "MAC Address",
    "element": "text",
    "format": "MAC"
  }
}

Associate Field with Fieldset

{
  "action": "associate",
  "field_id": 5,
  "fieldset_id": 1,
  "required": true,
  "order": 1
}

Response Format

All tools return structured JSON responses:

Success (create):

{
  "success": true,
  "action": "create",
  "asset": {
    "id": 123,
    "asset_tag": "LAP-001",
    "name": "MacBook Pro 14"
  }
}

Success (list):

All list endpoints return pagination metadata:

{
  "success": true,
  "action": "list",
  "count": 3,
  "total": 1602,
  "limit": 20,
  "offset": 0,
  "has_more": true,
  "assets": [ ... ]
}

Field

Description

count

Number of items in this page

total

Total items matching the query

limit

Page size used

offset

Starting offset

has_more

true if more pages remain

Error:

{
  "success": false,
  "error": "Asset not found: Asset with tag LAP-999 not found."
}

Architecture

src/snipeit_mcp/
├── __init__.py        # Public API re-exports
├── __main__.py        # Entry point (snipeit-mcp script)
├── mcp_server.py      # FastMCP instance + tool whitelist + optional-tool visibility
├── client.py          # SnipeIT API clients
├── judgment.py        # Judgment backend config/selection + shared HTTP retry (optional tools)
├── systemone.py       # System One protocol backend (TypeSafe Jev, Laya, CLM, …)
├── chat_judge.py      # OpenAI-compatible chat backend (Ollama, vLLM, LM Studio, …)
├── config.py          # Transport + auth-mode config (OAuth / API key / multi-identity)
├── identity.py        # Multi-identity registry (tokens → PATs), ContextVar, validation
├── http_auth.py       # Multi-identity HTTP auth (401, /healthz) + audit log + tool policy
├── schemas.py         # Pydantic input schemas
└── tools/             # 11 modules grouped by Snipe-IT domain
    ├── assets.py
    ├── inventory.py
    ├── foundational.py
    ├── licenses.py
    ├── people.py
    ├── custom_fields.py
    ├── reports.py
    ├── imports.py
    ├── system.py
    └── data_quality.py   # find_duplicates / match_records (judgment-backed)

Built with:

  • FastMCP: Python framework for MCP servers

  • snipeit-python-api: Snipe-IT API client

  • Pydantic: Data validation and type safety

  • Judgment backends (optional): the System One protocol (TypeSafe Jev, Laya, CLM, …) or any OpenAI-compatible chat server (Ollama, …) behind the data-quality tools

Troubleshooting

Authentication Errors

  • Verify your Snipe-IT URL includes the protocol (https://)

  • Check that your API token is valid and not expired

  • Ensure the token has appropriate permissions for the operations

Connection Errors

  • Verify network connectivity to your Snipe-IT instance

  • Check for any firewall or proxy restrictions

  • Ensure the Snipe-IT instance is running

Validation Errors

  • Check that required fields are provided (e.g., status_id and model_id for assets)

  • Verify that referenced IDs exist (categories, models, locations, etc.)

  • Review the tool documentation for required parameters

License

MIT License. See LICENSE.

Contributing

Contributions welcome! Please open an issue or submit a pull request.

Issues and pull requests are generally reviewed on Mondays (unless I'm on vacation), so expect a reply within about a week. New issues get labelled automatically in the meantime.

Available Tools

40 tools
accessory_operationsA

Perform checkout/checkin operations on accessories.

Accessories can be checked out to a user, asset, or location. Each checkout decrements the available quantity, and checkin increments it back.

Operations:

  • checkout: Checkout an accessory to a user/asset/location (requires checkout_data with checkout_to_type and assigned_to_id)

  • checkin: Checkin an accessory (requires checkout_id from the checkout record)

  • list_checkouts: List all users who have this accessory checked out

Returns: dict: Result of the operation including success status and data

Inputs: action (required), accessory_id (required), checkout_id, checkout_data. Returns: object

activity_reportsA
Read-onlyIdempotent

Query Snipe-IT activity logs and reports.

Provides access to the activity log which tracks all actions performed in Snipe-IT including checkouts, checkins, updates, and more.

Actions:

  • list: List activity records with optional filtering

  • item_activity: Get activity for a specific item (requires item_type and item_id)

Returns: dict: Activity records matching the query

Inputs: action (required), limit, offset, search, +5 more. Returns: object

asset_filesA
Destructive

Manage file attachments for assets.

Operations:

  • upload: Upload one or more files to an asset

  • list: List all files attached to an asset

  • download: Download a specific file from an asset

  • delete: Delete a specific file from an asset

Returns: dict: Result of the operation including success status and data

Inputs: action (required), asset_id (required), notes, file_id, +2 more. Returns: object

asset_labelsA

Generate printable labels for assets.

Provide either asset_ids or asset_tags to generate labels for specific assets. The labels will be saved as a PDF file to the specified save_path.

Returns: dict: Result with path to generated labels PDF

Inputs: asset_ids, save_path, asset_tags. Returns: object

asset_licensesA
Read-onlyIdempotent

Get all licenses checked out to an asset.

Returns: dict: List of licenses associated with the asset

Inputs: asset_id (required). Returns: object

asset_maintenanceA
Destructive

Manage maintenance records for assets.

Operations:

  • create: Create a maintenance record for an asset (requires asset_id and maintenance_data)

  • list: List maintenance records, optionally filtered by asset_id, search, or completed

  • get: Get a single maintenance record by maintenance_id

  • update: Update a maintenance record (requires maintenance_id and update_data)

  • delete: Delete a maintenance record (requires maintenance_id)

  • complete: Mark a maintenance record complete (requires maintenance_id; Snipe-IT v8.7+)

Returns: dict: Result of the operation including success status and data

Inputs: action (required), note, limit, offset, +6 more. Returns: object

asset_operationsA

Perform state operations on assets (checkout, checkin, audit, restore).

Operations:

  • checkout: Check out an asset to a user, location, or another asset

  • checkin: Check in an asset back to inventory

  • audit: Mark an asset as audited

  • restore: Restore a soft-deleted asset

Returns: dict: Result of the operation including success status and data

Inputs: action (required), asset_id (required), audit_data, checkin_data, +1 more. Returns: object

asset_requestsA

Manage asset checkout requests (as the authenticated user).

Allows users to request checkout of requestable assets. Assets must have the 'requestable' flag set (either on the asset or its model).

Operations:

  • request: Submit a request to checkout an asset (requires asset_id)

  • cancel: Cancel a pending request (requires asset_id)

  • list: List the authenticated user's own pending checkout requests

  • requestable: List assets the authenticated user may request

Note: Approving/denying requests is only available through the web UI - there are no API endpoints for these administrative functions.

Returns: dict: Result of the operation including success status

Inputs: action (required), limit, offset, search, +2 more. Returns: object

audit_trackingA
Read-onlyIdempotent

Track asset audit status for compliance.

Snipe-IT tracks when assets were last audited and calculates when they're due for re-audit based on the configured threshold.

Operations:

  • due: Assets approaching their audit date (within warning threshold)

  • overdue: Assets that have passed their audit date

  • summary: Combined counts of due and overdue assets

The audit threshold is configured in Admin Settings → Notifications and determines the lookahead window for "due" assets.

Returns: dict: Audit status with asset details

Inputs: action (required), limit, offset. Returns: object

bulk_asset_operationsA
Destructive

Perform bulk operations on multiple assets at once (Snipe-IT v8.7+).

Operations:

  • edit: Apply the same field changes to every asset in asset_ids (PATCH /hardware/bulk; requires fields)

  • audit: Mark every asset in asset_ids as audited, optionally recording a note, location, and next audit date (POST /hardware/audit/bulk)

Snipe-IT applies per-asset permission checks, so one failing asset does not block the rest of the batch; check the returned payload for per-asset results.

Returns: dict: Result of the operation including success status and the API response

Inputs: action (required), asset_ids (required), note, fields, +3 more. Returns: object

component_operationsA

Perform checkout/checkin operations on components.

Components can be checked out to assets (not users). Each checkout decrements the available quantity.

Operations:

  • checkout: Checkout component(s) to an asset (requires checkout_data with assigned_to asset ID)

  • checkin: Checkin component(s) from an asset (requires checkout_id)

  • list_assets: List all assets that have this component checked out

Returns: dict: Result of the operation including success status and data

Inputs: action (required), component_id (required), checkout_id, checkout_data. Returns: object

ldap_operationsA

Manage LDAP synchronization.

Operations:

  • sync: Trigger LDAP user synchronization

  • test: Test LDAP connection settings

Note: LDAP must be configured in Snipe-IT settings before use. Previously required CLI (php artisan snipeit:ldap-sync) or web UI.

Returns: dict: Sync results or connection test status

Inputs: action (required). Returns: object

license_filesA
Destructive

Manage file attachments for licenses.

Operations:

  • upload: Upload a file to a license

  • list: List all files attached to a license

  • download: Download a specific file from a license

  • delete: Delete a specific file from a license

Returns: dict: Result of the operation including success status and data

Inputs: action (required), license_id (required), file_id, file_path, +1 more. Returns: object

license_seatsA

Manage license seat checkouts and checkins.

License seats can be assigned to users or assets.

Operations:

  • list: List all seats for a license (requires license_id)

  • checkout: Checkout a seat to a user or asset (requires license_id, seat_id, and checkout_data)

  • checkin: Checkin a seat (requires seat_id)

Returns: dict: Result of the operation including success status and data

Inputs: action (required), seat_id, license_id, checkout_data. Returns: object

manage_accessoriesA
Destructive

Manage Snipe-IT accessories with CRUD operations.

Accessories are quantity-based items (cables, adapters, peripherals) that can be checked out to users. Unlike assets, accessories are tracked by quantity rather than individually.

Operations:

  • create: Create a new accessory (requires accessory_data with name, qty, and category_id)

  • get: Retrieve a single accessory by ID

  • list: List accessories with optional pagination and filtering

  • update: Update an existing accessory (requires accessory_id and accessory_data)

  • delete: Delete an accessory (requires accessory_id)

Returns: dict: Result of the operation including success status and data

Inputs: action (required), sort, limit, order, +4 more. Returns: object

manage_assetsA
Destructive

Manage Snipe-IT assets with CRUD operations.

This tool handles all basic asset operations:

  • create: Create a new asset (requires asset_data with at least status_id and model_id)

  • get: Retrieve a single asset by ID, asset_tag, or serial number (uses dedicated bytag/byserial endpoints for reliable barcode scanning workflows)

  • list: List assets with optional pagination, filtering by status/model/company/location/category/manufacturer/assigned_to

  • update: Update an existing asset (requires asset_id and asset_data/extra_fields)

  • delete: Delete an asset (requires asset_id)

Use extra_fields for fields not in AssetData: asset_eol_date, custom fields (snipeit*), etc. For both create and update, extra_fields are validated against the model's fieldset before sending. Invalid field names will be rejected with a list of available fields.

Note: list action returns full asset objects. With high limits this can produce large responses. Use pagination (limit/offset) to control response size.

Sortable fields for list: id, name, asset_tag, serial, model, model_number, last_checkout, category, manufacturer, notes, expected_checkin, order_number, companyName, location, image, status_label, assigned_to, created_at, purchase_date, purchase_cost

Returns: dict: Result of the operation including success status and data

Inputs: action (required), sort, limit, order, +14 more. Returns: object

manage_backupsA
Idempotent

Manage Snipe-IT database backups.

Operations:

  • list: List available database backup files

  • download: Download a specific backup file

Note: Backup creation is triggered via web UI or CLI, not available via API.

Returns: dict: Backup list or download result

Inputs: action (required), filename, save_path. Returns: object

manage_categoriesA
Destructive

Manage Snipe-IT categories with CRUD operations.

Categories organize assets, accessories, consumables, components, and licenses.

Operations:

  • create: Create a new category (requires category_data with name and category_type)

  • get: Retrieve a single category by ID

  • list: List categories with optional pagination and filtering

  • update: Update an existing category (requires category_id and category_data)

  • delete: Delete a category (requires category_id)

Returns: dict: Result of the operation including success status and data

Inputs: action (required), sort, limit, order, +4 more. Returns: object

manage_companiesA
Destructive

Manage Snipe-IT companies with CRUD operations.

Companies allow you to segment your assets and users by organization. Useful for multi-tenant installations or tracking assets by subsidiary.

Actions:

  • create: Create a new company (requires company_data with name)

  • get: Retrieve a single company by ID

  • list: List companies with optional pagination and filtering

  • update: Update an existing company

  • delete: Delete a company

Returns: dict: Result of the operation including success status and data

Inputs: action (required), sort, limit, order, +4 more. Returns: object

manage_componentsA
Destructive

Manage Snipe-IT components with CRUD operations.

Components are items that can be checked out to assets (not users). Examples: RAM, hard drives, CPUs, etc.

Actions:

  • create: Create a new component (requires component_data with name, qty, category_id)

  • get: Retrieve a single component by ID

  • list: List components with optional pagination and filtering

  • update: Update an existing component

  • delete: Delete a component

Returns: dict: Result of the operation including success status and data

Inputs: action (required), sort, limit, order, +4 more. Returns: object

manage_consumablesA
Destructive

Manage Snipe-IT consumables with CRUD operations.

This tool handles all basic consumable operations:

  • create: Create a new consumable (requires consumable_data with name, qty, and category_id)

  • get: Retrieve a single consumable by ID

  • list: List consumables with optional pagination and filtering

  • update: Update an existing consumable (requires consumable_id and consumable_data)

  • delete: Delete a consumable (requires consumable_id)

Returns: dict: Result of the operation including success status and data

Inputs: action (required), sort, limit, order, +4 more. Returns: object

manage_departmentsA
Destructive

Manage Snipe-IT departments with CRUD operations.

Departments are organizational units within a company that can be assigned to users.

Actions:

  • create: Create a new department (requires department_data with name)

  • get: Retrieve a single department by ID

  • list: List departments with optional pagination and filtering

  • update: Update an existing department

  • delete: Delete a department

Returns: dict: Result of the operation including success status and data

Inputs: action (required), sort, limit, order, +4 more. Returns: object

manage_depreciationsA
Destructive

Manage Snipe-IT depreciations with CRUD operations.

Depreciations define how assets lose value over time (e.g., 3-year straight-line).

Operations:

  • create: Create a new depreciation (requires depreciation_data with name and months)

  • get: Retrieve a single depreciation by ID

  • list: List depreciations with optional pagination and filtering

  • update: Update an existing depreciation (requires depreciation_id and depreciation_data)

  • delete: Delete a depreciation (requires depreciation_id)

Returns: dict: Result of the operation including success status and data

Inputs: action (required), sort, limit, order, +4 more. Returns: object

manage_fieldsA
Destructive

Manage Snipe-IT custom fields with CRUD operations.

Custom fields allow you to add additional data fields to assets beyond the built-in fields. Fields must be associated with fieldsets to be used.

Actions:

  • create: Create a new custom field (requires field_data with name, element)

  • get: Retrieve a single field by ID

  • list: List fields with optional pagination and filtering

  • update: Update an existing field

  • delete: Delete a field

  • associate: Associate a field with a fieldset

  • disassociate: Remove a field from a fieldset

Returns: dict: Result of the operation including success status and data

Inputs: action (required), limit, order, offset, +5 more. Returns: object

manage_fieldsetsA
Destructive

Manage Snipe-IT fieldsets with CRUD operations.

Fieldsets are collections of custom fields that can be assigned to asset models. Each model can have one fieldset, and all assets of that model will have the custom fields defined in the fieldset.

Actions:

  • create: Create a new fieldset (requires fieldset_data with name)

  • get: Retrieve a single fieldset by ID

  • list: List fieldsets with optional pagination

  • update: Update an existing fieldset

  • delete: Delete a fieldset

  • fields: List all fields in a fieldset

  • reorder: Reorder fields in a fieldset (requires field_order list of field IDs)

Returns: dict: Result of the operation including success status and data

Inputs: action (required), limit, offset, field_order, +2 more. Returns: object

manage_groupsA
Destructive

Manage Snipe-IT permission groups with CRUD operations.

Groups are used to manage permissions for multiple users at once. Users can belong to multiple groups, and permissions are cumulative.

Actions:

  • create: Create a new group (requires group_data with name)

  • get: Retrieve a single group by ID

  • list: List groups with optional pagination and filtering

  • update: Update an existing group (including permissions)

  • delete: Delete a group

Returns: dict: Result of the operation including success status and data

Inputs: action (required), limit, offset, search, +2 more. Returns: object

manage_importsA
Destructive

Manage CSV import operations for bulk data import.

The import workflow is: upload → process (with import_type and field_map). Snipe-IT saves the column mapping when the import is processed; there is no separate step to store it.

Operations:

  • list: List all import files (with header row, first row and saved mapping)

  • get: Get one import file's details (taken from the list; Snipe-IT has no single-import endpoint)

  • upload: Upload a CSV file for import

  • delete: Delete an import file

  • process: Execute the import with import_data

Common field mappings for assets:

  • asset_tag, name, serial, model_id, status_id

  • purchase_date, purchase_cost, order_number

  • notes, warranty_months, supplier_id

  • location_id, company_id, category_id

Returns: dict: Result of the operation including success status and data

Inputs: action (required), file_path, import_id, import_data. Returns: object

manage_kitsA
Destructive

Manage Snipe-IT predefined kits (bundles of models, licenses, accessories, consumables).

Kit CRUD:

  • create: Create a kit (requires kit_data with name)

  • get / list / update / delete: Standard operations by kit_id

Kit contents (requires kit_id and item_type):

  • list_items: List the kit's models/licenses/accessories/consumables

  • add_item: Attach an item to the kit (requires item_id; optional quantity)

  • update_item: Change an attached item's quantity (requires item_id)

  • remove_item: Detach an item from the kit (requires item_id)

Note: checking out a kit to a user is only available in the Snipe-IT web UI; there is no kit-checkout API endpoint. To perform a kit checkout via MCP, list the kit's items and check each out individually.

Returns: dict: Result of the operation including success status and data

Inputs: action (required), sort, limit, order, +7 more. Returns: object

manage_licensesA
Destructive

Manage Snipe-IT licenses with CRUD operations.

Licenses track software licenses with seat-based allocation.

Operations:

  • create: Create a new license (requires license_data with name and seats)

  • get: Retrieve a single license by ID

  • list: List licenses with optional pagination and filtering

  • update: Update an existing license (requires license_id and license_data)

  • delete: Delete a license (requires license_id)

Returns: dict: Result of the operation including success status and data

Inputs: action (required), sort, limit, order, +4 more. Returns: object

manage_locationsB
Destructive

Manage Snipe-IT locations with CRUD operations.

Locations represent physical places where assets are stored or deployed.

Operations:

  • create: Create a new location (requires location_data with name)

  • get: Retrieve a single location by ID

  • list: List locations with optional pagination and filtering

  • update: Update an existing location (requires location_id and location_data)

  • delete: Delete a location (requires location_id)

  • assets: List all assets at a specific location

  • users: List all users assigned to a location

Returns: dict: Result of the operation including success status and data

Inputs: action (required), sort, limit, order, +4 more. Returns: object

manage_manufacturersA
Destructive

Manage Snipe-IT manufacturers with CRUD operations.

Manufacturers represent the companies that produce assets.

Operations:

  • create: Create a new manufacturer (requires manufacturer_data with name)

  • get: Retrieve a single manufacturer by ID

  • list: List manufacturers with optional pagination and filtering

  • update: Update an existing manufacturer (requires manufacturer_id and manufacturer_data)

  • delete: Delete a manufacturer (requires manufacturer_id)

Returns: dict: Result of the operation including success status and data

Inputs: action (required), sort, limit, order, +4 more. Returns: object

manage_modelsA
Destructive

Manage Snipe-IT asset models with CRUD operations.

Models define types of assets (e.g., 'MacBook Pro 14"', 'Dell XPS 15').

Operations:

  • create: Create a new model (requires model_data with name and category_id)

  • get: Retrieve a single model by ID

  • list: List models with optional pagination and filtering

  • update: Update an existing model (requires model_id and model_data)

  • delete: Delete a model (requires model_id)

  • assets: List all assets of a specific model

Returns: dict: Result of the operation including success status and data

Inputs: action (required), sort, limit, order, +4 more. Returns: object

manage_status_labelsA
Destructive

Manage Snipe-IT status labels with CRUD operations.

Status labels define the state of assets (deployable, pending, archived, etc.).

Operations:

  • create: Create a new status label (requires status_label_data with name and type)

  • get: Retrieve a single status label by ID

  • list: List status labels with optional pagination and filtering

  • update: Update an existing status label (requires status_label_id and status_label_data)

  • delete: Delete a status label (requires status_label_id)

  • assets: List all assets with a specific status label

Returns: dict: Result of the operation including success status and data

Inputs: action (required), sort, limit, order, +4 more. Returns: object

manage_suppliersA
Destructive

Manage Snipe-IT suppliers with CRUD operations.

Suppliers are vendors from whom assets and consumables are purchased.

Operations:

  • create: Create a new supplier (requires supplier_data with name)

  • get: Retrieve a single supplier by ID

  • list: List suppliers with optional pagination and filtering

  • update: Update an existing supplier (requires supplier_id and supplier_data)

  • delete: Delete a supplier (requires supplier_id)

Returns: dict: Result of the operation including success status and data

Inputs: action (required), sort, limit, order, +4 more. Returns: object

manage_usersA
Destructive

Manage Snipe-IT users with CRUD operations.

This tool handles all user operations:

  • create: Create a new user (requires user_data with username, password, first_name)

  • get: Retrieve a single user by ID

  • list: List users with optional pagination and filtering

  • update: Update an existing user (requires user_id and user_data)

  • delete: Delete a user (requires user_id)

  • restore: Restore a soft-deleted user (requires user_id)

  • me: Get the currently authenticated user

Returns: dict: Result of the operation including success status and data

Inputs: action (required), sort, email, limit, +6 more. Returns: object

model_filesA
Destructive

Manage file attachments for asset models.

Models can have attached files such as documentation, manuals, datasheets, or images that apply to all assets of that model.

Operations:

  • upload: Upload a file to a model

  • list: List all files attached to a model

  • download: Download a specific file from a model

  • delete: Delete a specific file from a model

Returns: dict: Result of the operation including success status and data

Inputs: action (required), model_id (required), file_id, file_path, +1 more. Returns: object

status_summaryA
Read-onlyIdempotent

Get asset counts grouped by status label.

Returns a summary of how many assets are in each status, useful for dashboard displays and reporting.

Returns: dict: Asset counts by status label

Inputs: no named parameters. Returns: object

system_infoA
Read-onlyIdempotent

Get Snipe-IT system information.

Returns version and installation details. Useful for compatibility checking and deployment verification.

Returns: dict: System version information

Inputs: no named parameters. Returns: object

user_assetsA
Read-onlyIdempotent

Get items checked out to a user.

Retrieves assets, accessories, licenses, and/or consumables that are currently checked out to the specified user. Also supports retrieving pending EULA acceptances.

Options:

  • assets: Hardware assets checked out to user

  • accessories: Accessories checked out to user

  • licenses: License seats assigned to user

  • consumables: Consumables checked out to user

  • eulas: Pending EULA/acceptance items (items requiring user acceptance)

  • all: All items except eulas (assets, accessories, licenses, consumables)

Note: The eulas option returns items requiring user acceptance via web portal. This helps identify users with pending acceptances for follow-up.

Returns: dict: Items checked out to the user

Inputs: user_id (required), asset_type. Returns: object

user_two_factorA
Destructive

Manage user two-factor authentication.

Administrative functions for managing user 2FA settings.

Operations:

  • reset: Reset a user's 2FA, requiring them to re-enroll

Note: This is an administrative function that affects user security.

Returns: dict: Result of the operation

Inputs: action (required), user_id (required). Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.8/5.0

    Scored across 40 tools

    Disambiguation4/5

    Tools are mostly separated by resource and operation, with clear distinctions between CRUD, state operations, file attachments, and reporting. A few asset-adjacent tools (manage_assets, asset_operations, bulk_asset_operations, audit_tracking) overlap enough to require careful reading, but descriptions resolve most ambiguity.

    Naming Consistency4/5

    The set uses consistent snake_case and a predictable entity-centric pattern, especially manage_<entity> for CRUD and <entity>_operations/_files for specialized actions. Some names deviate from the verb_noun pattern (asset_labels, status_summary, user_assets), but the overall convention remains readable.

    Tool Count3/5

    40 tools is heavy for an MCP server, even one covering a broad asset-management platform. The multi-action design keeps it from exploding further, and each tool maps to a Snipe-IT resource, but the surface is large enough to increase agent selection burden.

    Completeness4/5

    Coverage is broad: CRUD for most Snipe-IT entities, checkout/checkin operations, imports, files, licenses, audits, backups, and LDAP. A notable gap is consumable checkout/checkin operations, since consumables have CRUD but no operational tool analogous to accessories or components.

    Maintenance

    ActivityActive
    ResponsivenessLimited data

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      Not graded
      quality
      D
      maintenance
      Enables AI assistants to manage Snipe-IT inventory systems through comprehensive asset and consumable operations. Supports creating, updating, tracking, and managing IT assets, consumables, maintenance records, file attachments, and generating labels.
      1
      -
    • A
      license
      B
      quality
      D
      maintenance
      Enables AI assistants to connect with Freshservice ITSM for managing tickets, assets, agents, and organizational data through natural language. It provides a comprehensive set of tools for performing CRUD operations on service desk records and searching across the Freshservice platform.
      53
      293 npm
      1
      MIT
    • A
      license
      C
      quality
      D
      maintenance
      Enables AI assistants to manage GLPI inventory, tickets, and CIA security fields via its REST API.
      9
      25 npm
      1
      ISC
    • A
      license
      C
      quality
      B
      maintenance
      Enables querying and managing IT assets, users, locations, licenses, and more in Snipe-IT through natural language using Claude.
      28
      294 npm
      MIT