Snipe-IT MCP Server
This server gives an AI assistant full CRUD and operational control over a Snipe-IT inventory instance through 40 MCP tools spanning assets, inventory, people, configuration, licensing, reporting, imports, and system administration.
Assets: create, read (by ID, asset tag, or serial), list/filter/sort, update, and delete assets; check out, check in, audit, and restore them; perform bulk edits and bulk audits; attach/download/delete files; generate PDF labels; manage maintenance records; view associated licenses and submit or cancel checkout requests.
Inventory: manage consumables, components, and accessories, plus check components out to assets and accessories out to users, assets, or locations; manage predefined kits and their contents.
Users & org: manage users (including restore and current-user lookup), see everything checked out to a user, reset 2FA, and manage companies, departments, and permission groups.
Configuration: manage categories, manufacturers, models, status labels, locations (with assets/users queries), suppliers, and depreciation schedules; manage custom fields, fieldsets, and their associations/reordering.
Licensing: CRUD on licenses, seat checkout/checkin, and license file attachments.
Reporting: query activity logs and item history, get asset counts by status, and track audits due/overdue.
Imports: run the CSV import workflow — upload, map columns, and process.
System admin: get version info, list/download database backups, and trigger or test LDAP sync.
Data quality (optional): with a judgment backend configured, find probable duplicate manufacturers/models/suppliers/locations/categories/companies/departments and match free-text names to existing record IDs.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Snipe-IT MCP Server List assets overdue for audit"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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-mcp2. Install dependencies
uv sync3. 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 toolsVariable | Required | Description |
| Yes | Your Snipe-IT instance URL |
| Yes | API token for authentication |
| No | Comma-separated list of tool names to expose. If unset, all tools are available. |
Getting an API Token:
Log in to your Snipe-IT instance
Navigate to your user profile (top right menu)
Go to "Manage API Keys" or "Personal Access Tokens"
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):
Visit
https://your-snipeit-instance.com/admin/oauthCreate a new OAuth client
Set the redirect URI to
https://your-mcp-public-url/auth/callbackNote 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.1Variable | Required | Description |
| Yes | Your Snipe-IT instance URL |
| Yes | OAuth client ID from |
| Yes | OAuth client secret from |
| Yes | Public URL where this MCP server is reachable (used in the OAuth callback) |
| No | Override OAuth callback path (default |
| Yes | Must be |
| No | Bind address (default |
| Yes | TCP port for the HTTP server |
| No |
|
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.1Variable | Required | Description |
| Yes | Snipe-IT instance URL (shared by all identities) |
| Yes | Random bearer token the person uses to authenticate to this MCP server (min 32 chars, unique per person) |
| Yes | That person's Snipe-IT personal access token |
| No | Human-readable name used in log lines (identity keys are logged at startup, never token values) |
| No | Comma-separated tool allowlist for that person; enforced at call time and in |
| No | When true, blocks all write actions ( |
| No | Path to a JSON file with the same fields (list of objects with an explicit |
| Yes | Must be |
| Yes | TCP port for the HTTP server |
| No | Bind address (default |
| No |
|
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 differenceHow a request is handled:
The HTTP layer checks
Authorization: Bearer <mcp_token>. Missing or unknown token →401withWWW-Authenticate: Bearer, before any tool runs. Token comparison is constant-time (hmac.compare_digest).The identity is stored in a request-scoped context variable; the tool call then authenticates to Snipe-IT with that person's PAT.
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).
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 ( | Works with | Confidence | Speed / cost |
| TypeSafe Jev (hosted, needs a key from console.typesafe.ai); self-hosted open-weight System One models that serve the same | 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 |
| Any OpenAI-compatible | Not calibrated: the model's self-reported confidence, or vote frequency across | Seconds per question set on a local 8B model; a 100-pair scan is minutes, not seconds |
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 tunedSelf-hosted System One model (e.g. Laya):
JUDGMENT_BACKEND=systemone
JUDGMENT_BASE_URL=http://laya:8080 # must serve POST /v1/systemone
JUDGMENT_MODEL=layaOllama (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 |
| No |
|
| No | Default |
| For | Default |
| For hosted services | Sent as |
| No | Per-request timeout in seconds (default |
| No |
|
| No | Seconds one tool call may spend on backend calls in total (default |
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 |
One-shot installer. Creates a | |
Routine update — |
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.shThe 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 |
| Source tree (owned by service user) |
|
|
| Secrets and deployment-specific URLs ( |
| systemd unit; infra settings ( |
Configurable at install time via environment variables on the setup-snipeit-mcp.sh invocation:
Variable | Default | Notes |
|
| Source tree path |
|
| Service-user home / FASTMCP_HOME |
|
| Generated env file |
|
| Optional seed for |
|
| Always |
|
| Bind address. Loopback by default; set |
|
| TCP port |
|
|
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-Authenticatefrom 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.
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"
]
}
}
}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.
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/inspectorThen in the Inspector UI:
Transport Type:
Streamable HTTPURL: your server's
/mcpendpointConnection Type: must be Via Proxy, not Direct
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.
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 |
| CRUD operations with bytag/byserial lookup and advanced filtering |
| State operations (checkout, checkin, audit, restore) |
| Bulk edit and bulk audit across many assets at once (Snipe-IT v8.7+) |
| File attachments (upload, list, download, delete) |
| Generate printable PDF labels |
| Full maintenance lifecycle (create, list, get, update, delete, complete) |
| View licenses assigned to an asset |
| Submit/cancel checkout requests, list own requests and requestable assets |
Inventory Tools (5)
Tool | Description |
| CRUD operations for consumables |
| CRUD operations for components |
| Checkout/checkin components to assets |
| CRUD operations for accessories |
| Checkout/checkin accessories to users, assets, or locations |
Kit Tools (1)
Tool | Description |
| CRUD for predefined kits plus kit content management (models, licenses, accessories, consumables) |
User & Organization Tools (6)
Tool | Description |
| CRUD operations for users (+ restore, me) |
| Get items checked out to a user (assets, accessories, licenses, consumables, eulas) |
| Reset user two-factor authentication |
| CRUD operations for companies |
| CRUD operations for departments |
| CRUD operations for permission groups |
Configuration Tools (7)
Tool | Description |
| Manage categories for all item types |
| Manage manufacturer information |
| Manage asset models (+ list assets by model) |
| Manage status labels (+ list assets by status) |
| Manage locations (+ list assets/users by location) |
| Manage supplier information |
| Manage depreciation schedules |
Custom Field Tools (2)
Tool | Description |
| CRUD + associate/disassociate fields with fieldsets |
| CRUD operations for fieldsets (+ field listing, reorder) |
License Tools (3)
Tool | Description |
| CRUD operations for licenses |
| Manage license seat assignments |
| Manage license file attachments |
Reporting & Audit Tools (3)
Tool | Description |
| Query activity logs and item history |
| Get asset counts grouped by status label |
| Track assets due/overdue for audit |
Import Tools (1)
Tool | Description |
| CSV import workflow (upload, then process with type and column mapping) |
Data Quality Tools (2, optional — require a judgment backend)
Tool | Description |
| Find likely duplicate manufacturers, models, suppliers, locations, categories, companies or departments; pairwise judgments with score, confidence, both records and a merge hint |
| Resolve free-text names to existing record ids (or |
System Administration Tools (4)
Tool | Description |
| Get Snipe-IT version information |
| List and download database backups |
| LDAP sync and connection testing |
| 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 |
| Number of items in this page |
| Total items matching the query |
| Page size used |
| Starting offset |
|
|
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_idandmodel_idfor 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 toolsaccessory_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_reportsARead-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_filesADestructive
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_licensesARead-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_maintenanceADestructive
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_trackingARead-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_operationsADestructive
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_filesADestructive
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_accessoriesADestructive
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_assetsADestructive
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_backupsAIdempotent
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_categoriesADestructive
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_companiesADestructive
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_componentsADestructive
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_consumablesADestructive
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_departmentsADestructive
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_depreciationsADestructive
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_fieldsADestructive
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_fieldsetsADestructive
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_groupsADestructive
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_importsADestructive
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_kitsADestructive
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_licensesADestructive
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_locationsBDestructive
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_manufacturersADestructive
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_modelsADestructive
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_labelsADestructive
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_suppliersADestructive
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_usersADestructive
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_filesADestructive
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_summaryARead-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_infoARead-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_assetsARead-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_factorADestructive
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
Scored across 40 tools
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.
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.
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.
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
Related MCP Connectors
Discover, inspect and run 63,000+ agent tools from one balance. Pay per call, no subscriptions.
Query your team's drift, vulnerability, and upgrade data from any AI assistant. OAuth 2.1, 51 tools.
Aircraft intelligence for AI agents: valuations with uncertainty bands, FAA registry lookups, cost of ownership, comparable aircraft, fleet search, airworthiness directives and STCs, market metrics and forecasts, verified value reports, pre-buy diligence checklists, logbook search and a watchlist. 38 tools; free tier with OAuth or a Windsock API key.
Global B2B intelligence for AI agents: 35M+ companies, 1.6M sanctions, KYB pack. 78 tools.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables 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-
- AlicenseBqualityDmaintenanceEnables 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.53293 npm1MIT
- AlicenseCqualityDmaintenanceEnables AI assistants to manage GLPI inventory, tickets, and CIA security fields via its REST API.925 npm1ISC
- AlicenseCqualityBmaintenanceEnables querying and managing IT assets, users, locations, licenses, and more in Snipe-IT through natural language using Claude.28294 npmMIT