Snipe-IT MCP Server
This server is a comprehensive MCP bridge that lets AI assistants perform full CRUD and operational management across a Snipe-IT inventory system via 40 tools.
Asset management: create/read/update/delete assets, barcode/serial lookup, checkout/checkin/audit/restore, bulk operations, file attachments, PDF labels, maintenance records, license associations, and checkout requests
Inventory tracking: full CRUD and checkout/checkin for consumables, components, and accessories, including listing who has items checked out
Kits: create/manage predefined kits and their contents (models, licenses, accessories, consumables)
Users & organization: user CRUD, restore, current-user info, listing all items checked out per user, 2FA reset, plus companies, departments, and permission groups
Configuration: manage categories, manufacturers, models, status labels, locations, suppliers, and depreciation schedules
Custom fields: CRUD for custom fields and fieldsets, plus field association/reordering for models
Licensing: license CRUD, seat checkout/checkin, and license file attachments
Reporting & auditing: activity logs, item-specific history, asset counts by status, and audit due/overdue tracking
Imports & system administration: CSV import workflow, system version info, database backup listing/download, LDAP sync/test, and model file attachments
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 ServerList 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.
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
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.
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 Total)
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, map columns, process) |
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
├── client.py # SnipeIT API clients
├── 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/ # 10 modules grouped by Snipe-IT domain
├── assets.py
├── inventory.py
├── foundational.py
├── licenses.py
├── people.py
├── custom_fields.py
├── reports.py
├── imports.py
└── system.pyBuilt with:
FastMCP: Python framework for MCP servers
snipeit-python-api: Snipe-IT API client
Pydantic: Data validation and type safety
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
Contributing
Contributions welcome! Please open an issue or submit a pull request.
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
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The operation to perform on the accessory | |
| checkout_id | No | Checkout ID (required for checkin action) | |
| accessory_id | Yes | Accessory ID | |
| checkout_data | No | Checkout data (required for checkout action) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the inventory effect (checkout decrements quantity, checkin increments it back) and notes that checkin requires the checkout_id from a prior checkout. This goes beyond the annotations (which only say non-read-only, non-idempotent, non-destructive) and provides useful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and succinct: an introductory sentence, a bulleted list of operations with requirements, and a clear return type. Every sentence serves a purpose with no redundant fluff, and the most critical information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 4 parameters and 3 actions, the description covers the main operations, required parameters, and the quantity side effect. It also states a return type. It does not detail edge cases or list_checkouts output specifics, but given the schema and output schema exist, this is largely sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description reiterates the required parameters for each action (e.g., checkout requires checkout_data with checkout_to_type and assigned_to_id) and adds the nuance that checkout_id comes from the checkout record. Since the schema already provides 100% coverage with clear descriptions, the incremental value is modest, earning a baseline score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it performs checkout/checkin operations on accessories and lists the three specific operations (checkout, checkin, list_checkouts) with their targets. This distinguishes it from sibling tools like asset_operations or component_operations by scope and action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what each operation does and what parameters are required, but it does not explicitly contrast with alternatives or state when to use this tool over others. The context is clear from the name and sibling list, but no exclusions or alternative pointers are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of results to return | |
| action | Yes | The action to perform | |
| offset | No | Number of results to skip | |
| search | No | Search query | |
| item_id | No | Item ID for item_activity | |
| item_type | No | Item type for item_activity (e.g., 'asset', 'license', 'accessory') | |
| target_id | No | Filter by target ID | |
| action_type | No | Filter by action type (e.g., 'checkout', 'checkin', 'update') | |
| target_type | No | Filter by target type (e.g., 'asset', 'license', 'user') |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, so the safety profile is well-covered. The description adds meaningful behavioral context beyond annotations by specifying that item_activity requires both item_type and item_id, and by noting the return format (dict). It does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is reasonably concise and well-structured with an intro, action list, and return type. It avoids excessive detail and is front-loaded with the core purpose. Slight redundancy exists in the 'Returns: dict' line, which is already covered by the output schema, but it does not significantly detract.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 9 parameters and one required action enum, the description is sufficiently complete. It explains the two modes, the one constraint on item_activity, and the return type. The output schema exists, so the description need not dwell on return details. No critical gaps are evident.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema parameter description coverage is 100%, so the schema already documents each parameter thoroughly. The description adds minimal extra parameter meaning—only the grouping into actions and the requirement for item_activity. This matches the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: 'Query Snipe-IT activity logs and reports.' It further breaks down the two primary actions (list and item_activity), which helps distinguish it from sibling tools like audit_tracking or asset_operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use each action: 'list' for general activity records with filtering, and 'item_activity' for a specific item, noting it requires item_type and item_id. However, it does not explicitly mention alternative tools or exclusion criteria, so it stops short of full when-not usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | Notes for uploaded files (for upload action) | |
| action | Yes | The file operation to perform | |
| file_id | No | File ID (required for download and delete actions) | |
| asset_id | Yes | Asset ID | |
| save_path | No | Path to save downloaded file (for download action) | |
| file_paths | No | List of file paths to upload (for upload action) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description does not disclose behavioral traits beyond what the annotations already convey. Annotations mark this as destructive (destructiveHint=true), and while the description mentions 'delete' as an operation, it adds no extra detail such as whether deletions are irreversible or if special permissions are required. The return format is also redundant given the existing output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear title and bulleted operations, and it is concise without unnecessary fluff. The 'Returns' line is redundant with the output schema but does not significantly detract from readability. Overall, it is efficient and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (6 parameters, destructive action) and rich schema/annotations, the description provides a sufficient high-level overview but lacks deeper contextual details such as prerequisites (e.g., asset must exist), potential side effects of uploads, or behavior when actions fail. The schema covers parameter specifics, so the description is adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does not add any parameter-specific meaning beyond what the schema already provides; it merely lists high-level operations and returns a generic dict, leaving the schema to explain parameter details like file_id being required for download/delete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose as 'Manage file attachments for assets' and enumerates the specific operations (upload, list, download, delete). This distinguishes it from sibling tools like asset_operations or manage_assets, which handle broader asset lifecycle or CRUD operations, not file attachments.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context by listing the four operations, making it evident when to use this tool (e.g., uploading files to an asset, downloading attached files). However, it does not explicitly compare with alternatives or state when not to use it, so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| asset_ids | No | List of asset IDs to generate labels for | |
| save_path | No | Path where the PDF labels file should be saved | /tmp/asset_labels.pdf |
| asset_tags | No | List of asset tags to generate labels for |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all false, providing minimal guidance. The description adds useful behavioral context: it generates a PDF file, saves it to a specified path, and returns a dict with the path. However, it does not disclose edge cases like what happens if both asset_ids and asset_tags are provided, whether existing files are overwritten, or any permission requirements. The description is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the primary purpose. The input and return information are separated clearly, with a dedicated 'Returns:' section. Every sentence earns its place, and there is no repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity and the presence of a full input schema and an output schema reference, the description covers the essential use case well. It explains the two input modes and the artifact produced. However, it omits handling of edge cases (e.g., neither identifier provided, behavior when the file already exists) and does not elaborate on the return dict structure beyond a brief mention. This is slightly more than adequate but not exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers all three parameters with descriptions (100% coverage), and the description adds the key semantic insight that asset_ids and asset_tags are alternatives ('Provide either'). This goes beyond the schema, which simply lists each independently. The save_path parameter is also contextualized as the destination for the PDF.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a specific verb+resource: 'Generate printable labels for assets.' This clearly distinguishes the tool from sibling tools like manage_assets or asset_files, which handle other asset-related operations. The scope is well-defined.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states the input options ('Provide either asset_ids or asset_tags') and the output behavior (saved to save_path). While it doesn't explicitly compare to alternatives, it gives unambiguous context for when to use this tool: whenever printable asset labels are needed. The lack of explicit exclusions or alternative tool references prevents a higher score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
asset_licensesARead-onlyIdempotent
Get all licenses checked out to an asset.
Returns: dict: List of licenses associated with the asset
| Name | Required | Description | Default |
|---|---|---|---|
| asset_id | Yes | Asset ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is clear. The description adds the 'checked out' semantic but does not disclose additional behavioral traits like pagination, ordering, or error conditions. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with the primary action front-loaded. The 'Returns:' line is short and relevant, making the entire description efficient and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with one parameter and an output schema, the description is sufficient to understand the tool's purpose and result format. It could mention edge cases or relationships to license seats, but the annotations and schema cover the essentials.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of parameters with a clear description for asset_id ('Asset ID'), and the tool description does not add any further semantic detail. Baseline 3 applies because the schema already handles the parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Get' with a clear resource 'licenses checked out' and scoping 'to an asset'. This distinguishes it from sibling tools like manage_licenses or license_seats, which manage licenses themselves or per-license seat assignments.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage (when you need licenses associated with an asset) but provides no explicit guidance on when to prefer this tool over alternatives such as license_seats or asset_operations. No exclusions or alternatives are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Completion note (for complete action) | |
| limit | No | Number of results to return (for list action) | |
| action | Yes | The maintenance operation to perform | |
| offset | No | Number of results to skip (for list action) | |
| search | No | Search query (for list action) | |
| asset_id | No | Asset ID (required for create; optional filter for list) | |
| completed | No | Filter by completion state (for list action) | |
| update_data | No | Fields to change (required for update action) | |
| maintenance_id | No | Maintenance record ID (required for get, update, delete, complete) | |
| maintenance_data | No | Maintenance record data (required for create action) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive behavior, and the description aligns by listing the delete operation explicitly. It adds useful behavior beyond the schema, such as the Snipe-IT v8.7+ version dependency for the complete action and a concise return contract. It does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured, with a leading purpose sentence followed by a tight bullet list of operations. Each operation is one line and includes only necessary conditions. There is no filler or duplication.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-action dispatcher with ten parameters, the description provides a complete operation inventory, per-action parameter assignments, and the output type. The schema covers the remaining details, and the presence of an output schema means return values are fully documented. An agent here needs the information to select and invoke the correct action is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents each parameter's meaning, defaults, and action-specific requirements. The description restates which parameters are required for which action but does not add meaning beyond that. This meets the baseline for fully covered schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Manage maintenance records for assets.' It then enumerates all six operations, each with a clear action and target record. This clearly distinguishes the tool from asset-related siblings like manage_assets or asset_licenses.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly establishes when to use the tool and shows the functional context for each action, including action-specific requirements like asset_id for create and maintenance_id for get/update/delete/complete. It does not explicitly exclude alternatives, but no sibling tool covers maintenance records, so the usage context is sufficiently clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The operation to perform on the asset | |
| asset_id | Yes | Asset ID | |
| audit_data | No | Audit details (optional for audit action) | |
| checkin_data | No | Checkin details (optional for checkin action) | |
| checkout_data | No | Checkout details (required for checkout action) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate a non-read-only, non-idempotent, and non-destructive operation. The description adds semantic details like 'restore a soft-deleted asset' and 'mark as audited,' which are helpful. Yet it does not disclose prerequisites, side effects, or whether actions are reversible, and it repeats the return type that is also covered by the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a brief introduction, a bulleted list of operations, and a concise return section. Every sentence provides useful context without redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich input schema and presence of an output schema, the description is sufficient for understanding the tool's core purpose and operation types. It lacks explicit mapping between actions and their required data objects (e.g., checkout_data is required for checkout), but the schema's required fields provide that. Overall, it is adequately complete for a dispatch tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for all five parameters, so the baseline is 3. The description does not add significant parameter details beyond naming the operations; it mentions checkout targets (user, location, asset) which maps to the enum, but does not explain the action-to-data-object relationships.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb phrase 'Perform state operations on assets' and enumerates four distinct operations (checkout, checkin, audit, restore), which clearly distinguishes this tool from sibling tools focused on asset files, labels, maintenance, and licenses. It precisely defines the tool's scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The operation list implies the tool is for state-changing actions on assets, and the descriptions of each operation (e.g., 'check out an asset to a user, location, or another asset') clarify appropriate scenarios. However, it does not explicitly mention alternatives or exclusions, leaving some ambiguity for agents comparing with manage_assets.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of results to return (for requestable action) | |
| action | Yes | The request action to perform | |
| offset | No | Number of results to skip (for requestable action) | |
| search | No | Search query (for requestable action) | |
| asset_id | No | Asset ID (required for request and cancel; must be a requestable asset) | |
| request_data | No | Request details (for request action) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses important behavior: operations act only on the authenticated user's requests, assets must be requestable, and approval/denial are not exposed via API. This adds meaningful scope and limitation context that annotations alone do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with a clear overview, a compact list of operations, and a relevant note about administrative limits. It is concise and front-loaded, though the return type line adds limited value given the presence of an output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The definition covers the scope, required asset property, supported operations, and parameter relationships, making it sufficient for selecting and invoking the tool. It is missing very little, such as exact cancellation behavior or error semantics, but these are not essential for initial correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already covers all parameters, but the description goes further by mapping each operation to the relevant parameters, such as asset_id being required for request and cancel, and limit/offset/search applying to requestable. This association is not fully obvious from the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states this tool manages asset checkout requests scoped to the authenticated user, and enumerates four specific operations. This distinguishes it from sibling asset tools by naming the exact resource and user scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: it explains the 'requestable' flag requirement, which operations exist, and that admin approval is intentionally not available through the API. It does not explicitly name alternative tools or say when not to use this tool, but the behavioral boundaries are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of results to return | |
| action | Yes | The audit tracking action | |
| offset | No | Number of results to skip |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, and non-destructive behavior. The description adds meaningful context about audit threshold configuration and defines the operational semantics of 'due' vs 'overdue', going beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear purpose statement, bulleted operations, and a brief note on configuration. Every sentence serves a purpose, and the content is front-loaded with the tool's function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, annotations (safe read operation), and presence of an output schema, the description adequately covers behavior, operation semantics, and configuration context. It is complete for an AI agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for parameter descriptions, setting a baseline of 3. The description enriches the 'action' enum by explaining what each value (due, overdue, summary) actually computes, adding value beyond the schema's generic parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool tracks asset audit status for compliance, with explicit operation modes (due, overdue, summary). It distinguishes itself from sibling tools by focusing on audit-specific reporting rather than general asset management or status reporting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool (for audit tracking) and enumerates the three available actions. It does not explicitly name alternative tools or exclusions, so it falls short of full guidance, but the usage context is well implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Audit note (for audit action) | |
| action | Yes | The bulk operation to perform | |
| fields | No | Fields to set on every asset (for edit action): status_id, model_id, company_id, location_id/rtd_location_id, name, custom fields (_snipeit_*), etc. | |
| asset_ids | Yes | IDs of the assets to operate on | |
| location_id | No | Location observed during audit (for audit action) | |
| next_audit_date | No | Next audit date, YYYY-MM-DD (for audit action) | |
| update_location | No | Also move the assets to location_id, not just record it in the audit (for audit action) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description meaningfully adds behavioral context beyond the annotations by explaining Snipe-IT's per-asset permission checks, partial batch behavior, and the need to inspect the returned payload for per-asset results. Annotations already signal destructiveness and non-idempotency, and the description reinforces those concerns within operation details. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description uses a compact structured format with a one-line summary, clear operation bullets, and a natively concise note about batch failure behavior and return value. There is minimal redundancy and the most important usage scope appears first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with two actions, the description covers the operations, endpoint paths, required parameter conditions, behavior during partial failures, and result expectations. Combined with 100% schema description coverage and an output schema, an agent has enough context to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each parameter is documented in the schema. The description still adds value by clarifying that 'fields' is required for the edit action and by mapping note, location_id, next_audit_date, and update_location to the audit action, which aids correct selection based on the chosen action.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Perform bulk operations on multiple assets at once' and enumerates the two operations (edit, audit) with their specific endpoints. It distinguishes from single-asset tools by emphasizing the bulk nature and explicit action list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies this tool is for batch operations on multiple assets, while sibling tools like asset_operations handle single assets. It does not name an explicit alternative for single-asset workflows, so the usage guidance is strong but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The operation to perform on the component | |
| checkout_id | No | Component asset ID from checkout record (required for checkin) | |
| component_id | Yes | Component ID | |
| checkout_data | No | Checkout data (required for checkout action) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is not read-only and not destructive. The description adds a key behavioral detail beyond annotations: 'Each checkout decrements the available quantity.' It also discloses the return structure as a dict. This is valuable context, though it omits potential failure modes or authorization requirements, keeping it at a 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a brief intro, a bulleted list of operations, and a return type line. It is not padded with fluff, though the 'Returns:' section could be trimmed since output schema already provides that detail. Still, it is efficient and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 4 parameters, 3 actions, and an output schema, the description provides enough context to understand the tool's role and how to invoke each action. It covers purpose, operations, parameter requirements, and returns. It could mention edge cases or prerequisites (e.g., items must be in stock), but it is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all parameters are already documented. The description adds value by mapping parameters to actions: it specifies that checkout requires checkout_data, checkin requires checkout_id, and list_assets needs none. This conditional information is not fully captured in the schema, so the description elevates the semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Perform checkout/checkin operations on components.' It then enumerates three distinct operations (checkout, checkin, list_assets), making its purpose unmistakable. It also distinguishes itself from component management tools by focusing on operational actions rather than CRUD management.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use each operation by stating required inputs: checkout requires checkout_data, checkin requires checkout_id, and list_assets needs no extra. However, it does not explicitly compare with sibling tools or state when not to use this tool, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The LDAP action to perform |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a non-read-only, non-idempotent operation. Description adds the prerequisite configuration note but does not disclose specific side effects of sync (e.g., user creation/updates) beyond action names.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with a leading summary, bulleted operations, and a return note. The 'Previously required CLI' sentence is slightly extra but adds helpful historical context; overall concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool, the description adequately covers prerequisites, operations, and return type. Given an output schema exists, it is complete enough for an agent to select and invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with a single parameter having an enum and its own description. Description adds no further parameter detail beyond repeating the actions, which are already self-explanatory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool manages LDAP synchronization and enumerates the two operations (sync and test), making the purpose specific and distinguishable from sibling tools focused on assets, users, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context: LDAP must be configured before use, and mentions the tool replaces the previous CLI/web UI flow. It implies when to use but does not explicitly state alternatives or when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The file operation to perform | |
| file_id | No | File ID (required for download and delete actions) | |
| file_path | No | File path to upload (for upload action) | |
| save_path | No | Path to save downloaded file (for download action) | |
| license_id | Yes | License ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations declare destructiveHint=true, so the agent already knows delete is destructive; the description's 'delete' operation aligns with that. The description adds little beyond the schema and annotations, only noting that operations return a dict with success status and data. It does not disclose side effects like permanent deletion, auth requirements, or file size limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately brief and well-structured with a heading, a bulleted list of operations, and a returns line. No redundant sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of a complete input schema, an output schema, and annotations, the description provides a sufficient overview of the tool's operations and return format. It could mention constraints like file size or permanent deletion, but those are not essential for basic usage with the available structured metadata.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes all five parameters with 100% coverage, including the action enum and notes that file_id is required for download/delete. The description's operation list essentially paraphrases the enum values and does not add meaningful parameter semantics beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Manage' with the resource 'file attachments for licenses' and enumerates four concrete operations (upload, list, download, delete). This clearly distinguishes it from sibling tools like asset_files and model_files by focusing on licenses.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context that this tool is for license file management and lists operations with one-line definitions. However, it does not explicitly state when NOT to use this tool or point to alternatives for other entities, so it lacks exclusionary guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The action to perform on license seats | |
| seat_id | No | Seat ID (required for checkout and checkin) | |
| license_id | No | License ID (required for list and checkout) | |
| checkout_data | No | Checkout data (required for checkout action) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations contain no safety hints (all false), so the description must carry the burden. It lists operations and notes the return type ('dict: Result of the operation including success status and data'), but does not disclose side effects, permission requirements, or error conditions. The operation descriptions themselves imply state changes, but no further context is added.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a one-sentence summary, a brief note on seat assignability, a bulleted list of operations with requirements, and a return type line. Every sentence adds value; no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-action tool, the description covers all three operations, their prerequisites, and the return shape. It omits edge cases (e.g., checking in an already-checked-in seat) and permission notes, but given an output schema exists and the sibling context is clear, this is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds important per-action parameter requirements, such as 'checkin requires seat_id' and 'checkout requires license_id, seat_id, and checkout_data'. This clarifies conditional usage beyond the flat schema and is genuinely useful for an agent selecting parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Manage license seat checkouts and checkins.' It enumerates three specific operations (list, checkout, checkin) with their requirements, making it distinct from license-level tools like manage_licenses.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage guidance is provided per operation, e.g., 'list: List all seats for a license (requires license_id)' and 'checkout: Checkout a seat to a user or asset (requires license_id, seat_id, and checkout_data)'. This gives concrete contexts for use, though it doesn't explicitly exclude alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Field to sort by (for list action) | |
| limit | No | Number of results to return (for list action) | |
| order | No | Sort order (for list action) | |
| action | Yes | The action to perform on accessories | |
| offset | No | Number of results to skip (for list action) | |
| search | No | Search query (for list action) | |
| accessory_id | No | Accessory ID (required for get, update, delete) | |
| accessory_data | No | Accessory data (required for create, optional for update) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the description aligns with these. It adds the return format ('dict: Result ...') and the fact that delete is included, but it does not disclose deeper behavioral traits like irreversible changes, required permissions, or error handling. Since annotations cover the safety profile, this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a one-line summary, a brief contextual note, a bulleted list of operations, and a return description. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all five CRUD actions and their essential parameter requirements, and mentions the return type. An output schema exists, so detailed return fields are unnecessary. It lacks explicit notes on pagination defaults or sorting behavior, but those are documented in the input schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% parameter coverage, so baseline is 3. However, the description adds critical requirement details: it specifies that create action requires accessory_data with name, qty, and category_id, which is not marked as required in the schema. This extra guidance significantly helps the agent form correct calls.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'Manage Snipe-IT accessories with CRUD operations' and enumerates all actions (create, get, list, update, delete), making the purpose unmistakable. It also distinguishes accessories from assets by noting they are quantity-based, but it does not explicitly differentiate from the sibling tool 'accessory_operations'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides contextual guidance by explaining that accessories are quantity-based and can be checked out to users, implying when this tool is appropriate. It also gives per-action requirement hints (e.g., create requires name, qty, category_id), but it does not explicitly compare to alternatives or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Field to sort by (for list action). Valid fields: 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 | |
| limit | No | Number of results to return per page (for list action). Default 20 because each asset payload is large (~5KB with custom fields). | |
| order | No | Sort order (for list action) | |
| action | Yes | The action to perform on assets | |
| offset | No | Number of results to skip (for list action) | |
| search | No | Search query (for list action) | |
| serial | No | Serial number (alternative to asset_id for get) | |
| asset_id | No | Asset ID (required for get, update, delete) | |
| model_id | No | Filter by model ID (for list action) | |
| asset_tag | No | Asset tag (alternative to asset_id for get) | |
| status_id | No | Filter by status label ID (for list action) | |
| asset_data | No | Asset data for standard fields (required for create, optional for update) | |
| company_id | No | Filter by company ID (for list action) | |
| assigned_to | No | Filter by assigned user/asset/location ID (for list action) | |
| category_id | No | Filter by category ID (for list action) | |
| location_id | No | Filter by location ID (for list action) | |
| extra_fields | No | Additional fields not in AssetData: asset_eol_date, custom fields (_snipeit_*), etc. For update, fields are validated against the asset's model fieldset. | |
| manufacturer_id | No | Filter by manufacturer ID (for list action) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (destructiveHint=true), the description discloses important behaviors: warning about large list responses, extra_fields validation with rejection of invalid names, and the use of dedicated endpoints for get. This adds substantial context about the tool's behavior, though some details like return format are left to the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with bullets and notes, making it easy to scan. It is somewhat lengthy due to listing all sortable fields (duplicated in schema) and detailed action requirements, but every section contributes value. The overall organization is effective for a complex CRUD tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (18 params, 5 actions) and the presence of an output schema and full schema coverage, the description provides complete operational guidance. It covers required inputs per action, validation behaviors, response size considerations, and sortable fields. Slightly more detail on return value specifics could improve it, but it is largely sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 100% schema coverage, the description enriches parameter understanding by mapping parameters to actions, e.g., 'asset_id required for get, update, delete' and 'extra_fields are validated against the model's fieldset.' It also clarifies that asset_data needs status_id and model_id for create, which is not explicitly in the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Manage Snipe-IT assets with CRUD operations.' It then enumerates each operation (create, get, list, update, delete) with specific actions, making it distinct from sibling tools like asset_files or asset_maintenance. The scope is well-defined as 'all basic asset operations.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use each action, such as 'create requires asset_data with at least status_id and model_id' and 'get uses dedicated endpoints for barcode scanning.' However, it does not explicitly name alternatives or state when not to use this tool, though the sibling tool list implies specialized tools exist for other asset operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The backup action to perform | |
| filename | No | Backup filename (for download) | |
| save_path | No | Local path to save backup (for download) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There is a contradiction: the annotation readOnlyHint=false conflicts with the description's implied read-only operations (list and download). Since readOnlyHint is false, the description should have clarified that no modifications are made. The note about backup creation not being available is helpful but insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured with a clear bullet list of operations and a relevant note. The 'Returns: dict' line is redundant given the output schema, slightly reducing efficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-operation tool with a solid schema and output schema, the description covers the essentials, including the critical limitation about backup creation. However, the readOnlyHint contradiction and lack of explicit read-only clarification slightly reduce completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides full descriptions for all three parameters with 100% coverage, and the description text adds no extra meaning beyond the operations list. The baseline of 3 applies because the schema already does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool manages Snipe-IT database backups, listing specific operations (list and download) and explicitly notes backup creation is not available via API. This distinguishes it from sibling tools by focusing on backup retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear context: this tool handles listing and downloading backups only, and explicitly warns that backup creation must be done via web UI or CLI. No alternative tools are named, but the scope is well-defined.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Field to sort by (for list action) | |
| limit | No | Number of results to return (for list action) | |
| order | No | Sort order (for list action) | |
| action | Yes | The action to perform on categories | |
| offset | No | Number of results to skip (for list action) | |
| search | No | Search query (for list action) | |
| category_id | No | Category ID (required for get, update, delete) | |
| category_data | No | Category data (required for create, optional for update) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the description is not responsible for that. The description adds operation-level details (e.g., requires category_data) but does not disclose side effects of delete (e.g., what happens to associated items) or other behavioral traits beyond what the annotations cover. Thus it adds some value but not rich context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with an introductory sentence, a clear list of operations, and a return type. It is somewhat longer than necessary but every sentence serves a purpose. It avoids redundancy and is easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (multiple CRUD actions) and the presence of an output schema and annotations, the description is largely complete. It covers all actions, required parameters, and the return format. It lacks edge-case notes (e.g., pagination limits or error conditions) but these are minor gaps for a well-documented schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by specifying which parameters are required per action, notably that create requires category_data with name and category_type, which is not fully captured in the schema's per-field optionality. This clarifies usage beyond the schema's generic descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it manages Snipe-IT categories with CRUD operations, listing each operation (create, get, list, update, delete) with a specific verb and resource. This distinguishes it from sibling tools like manage_assets or manage_models, which target different entities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear context by explaining that categories organize assets, accessories, consumables, components, and licenses, and it enumerates operations with their requirements. However, it does not explicitly name alternative tools or state when not to use this tool, so it lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Field to sort by (for list action) | |
| limit | No | Number of results to return (for list action) | |
| order | No | Sort order (for list action) | |
| action | Yes | The action to perform on companies | |
| offset | No | Number of results to skip (for list action) | |
| search | No | Search query (for list action) | |
| company_id | No | Company ID (required for get, update, delete) | |
| company_data | No | Company data (required for create, optional for update) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description enumerates all actions and specifies that create requires company_data with name, which adds practical behavioral detail. It also states the return format ('dict: Result of the operation including success status and data'), going beyond the annotations. The destructiveHint is consistent with the delete action, and no contradictions are present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured, starting with a summary, then a brief context line, followed by a clean action list and return type. Every sentence serves a purpose without redundancy or unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (8 parameters, multiple actions) and the presence of a full schema and output schema, the description adequately covers purpose, actions, and return format. It lacks explicit details about cascading effects of deletion, but the destructiveHint annotation compensates for that gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides 100% coverage for all parameters, including descriptions for action, company_id, company_data, and list filters. The description adds minimal meaning beyond the schema, merely restating that create requires company_data and list supports pagination/filtering, which the schema already communicates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Manage Snipe-IT companies with CRUD operations,' clearly identifying the resource (companies) and the operations (CRUD). The action list further details each operation, and the contextual note about segmentation distinguishes this from sibling tools managing other resource types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains when companies are useful ('multi-tenant installations or tracking assets by subsidiary'), providing clear context for usage. It does not explicitly mention alternatives or exclusion criteria, but the resource-specific scope makes the intended use unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Field to sort by (for list action) | |
| limit | No | Number of results to return (for list action) | |
| order | No | Sort order (for list action) | |
| action | Yes | The action to perform on components | |
| offset | No | Number of results to skip (for list action) | |
| search | No | Search query (for list action) | |
| component_id | No | Component ID (required for get, update, delete) | |
| component_data | No | Component data (required for create, optional for update) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already label this as non-read-only and destructive; the description confirms the delete action but adds little beyond that. It does state that create requires name, qty, and category_id, and that components are asset-checkout items, which is useful context but not a deep behavioral disclosure (e.g., no info on side effects, permissions, or irreversibility).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Organized into a one-sentence summary, domain definition with examples, bullet-pointed action list, and a return type line. Each section has a purpose and the length is appropriate for a five-action CRUD tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers all five actions, domain meaning, the parameter requirements for create, and a basic return description. It does not explain pagination shape, error handling, or update semantics, but the schema covers parameter details and the output schema (mentioned in context signals) likely covers return structure. Adequate for the complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, description still adds value by mapping each action to the relevant parameters (e.g., 'get: Retrieve a single component by ID', 'list: List components with optional pagination and filtering', and explicitly identifying required fields for create: name, qty, category_id). This goes beyond the schema, which describes parameters individually but not per-action requirements.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States 'Manage Snipe-IT components with CRUD operations' and enumerates all five actions with one-line explanations. Defines components in domain terms ('items that can be checked out to assets') and gives examples, making the tool's scope unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides domain context that components are not checked out to users, and lists actions, but never mentions when to prefer this tool over the sibling `component_operations` or how it relates to `manage_assets`/`manage_consumables`. No exclusions or alternatives discussed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Field to sort by (for list action) | |
| limit | No | Number of results to return (for list action) | |
| order | No | Sort order (for list action) | |
| action | Yes | The action to perform on consumables | |
| offset | No | Number of results to skip (for list action) | |
| search | No | Search query (for list action) | |
| consumable_id | No | Consumable ID (required for get, update, delete) | |
| consumable_data | No | Consumable data (required for create, optional for update) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true and readOnlyHint=false. The description adds per-action input requirements and notes the return shape (success status and data), which goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a one-line summary followed by a scannable action list and a brief returns note. Every sentence adds relevant information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a CRUD dispatcher with an output schema and rich input schema, the description adequately covers all actions, required fields, and result semantics. It could mention pagination/filtering parameters explicitly, but the schema already documents those, so the description is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by specifying which parameters are required for each action (e.g., consumable_id for get/update/delete, consumable_data for create) and highlights key nested fields like name, qty, and category_id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool manages Snipe-IT consumables with a full CRUD operation set, and enumerates each action (create, get, list, update, delete). This distinguishes it from sibling resource managers by resource type and scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly frames the tool as handling 'all basic consumable operations' and provides per-action requirements (e.g., create needs consumable_data with name, qty, category_id). It gives clear context for when to use each action, though it does not mention alternatives or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Field to sort by (for list action) | |
| limit | No | Number of results to return (for list action) | |
| order | No | Sort order (for list action) | |
| action | Yes | The action to perform on departments | |
| offset | No | Number of results to skip (for list action) | |
| search | No | Search query (for list action) | |
| department_id | No | Department ID (required for get, update, delete) | |
| department_data | No | Department data (required for create, optional for update) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, and the description aligns by listing a delete action. The description adds a return type note ('dict...') and create requirements ('requires department_data with name'), but doesn't disclose specifics about deletion consequences or other behavioral nuances. With annotations covering the safety profile, this meets the baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear opening, a brief context sentence, bulleted actions, and a returns section. It is slightly longer than necessary but each section earns its place. No redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers CRUD operations, parameter requirements, and return format. Since an output schema exists, it needn't explain return values in detail. It is sufficiently complete for a moderate-complexity CRUD tool, though it could mention pagination/filtering specifics (already in schema) or how department_data interacts with actions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by noting that create 'requires department_data with name', which is not enforced in the schema (name is nullable). This clarifies a critical requirement beyond what the structured schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Manage Snipe-IT departments with CRUD operations', clearly stating the resource and verb. It then enumerates specific actions (create, get, list, update, delete), which distinguishes it from sibling tools focused on other resources like assets or users.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage through its action list, making it clear the tool is for department management. It doesn't explicitly say when to use this over alternatives, but the resource-specific wording and sibling context make that self-evident. Minor deduction for not stating exclusions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Field to sort by (for list action) | |
| limit | No | Number of results to return (for list action) | |
| order | No | Sort order (for list action) | |
| action | Yes | The action to perform on depreciations | |
| offset | No | Number of results to skip (for list action) | |
| search | No | Search query (for list action) | |
| depreciation_id | No | Depreciation ID (required for get, update, delete) | |
| depreciation_data | No | Depreciation data (required for create, optional for update) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint=true), the description reveals that delete is one of the operations and explains the return format ('dict: Result of the operation including success status and data'). It also details parameter requirements per action, adding value beyond the safety hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a brief overview, a bulleted list of operations, and a return type. It is informative without being verbose; every sentence adds context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a CRUD tool with 8 parameters and 5 actions, the description covers all operations, their required inputs, and the return type. It also defines the domain concept (depreciations), making it self-contained. The existing output schema covers return details, so this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% coverage, providing descriptions for all parameters. The description adds value by clarifying that create requires depreciation_data with name and months, which is not explicitly marked as required in the schema's nested object. However, most parameter semantics are already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Manage Snipe-IT depreciations with CRUD operations' with a clear verb and resource, and it defines what depreciations are. This clearly distinguishes it from sibling tools that manage other Snipe-IT entities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description lists all CRUD operations and specifies required parameters for each (e.g., create requires depreciation_data, get/update/delete require depreciation_id). It provides clear operational context, though it does not explicitly mention alternatives or when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of results to return (for list action) | |
| order | No | Display order in fieldset (for associate action) | |
| action | Yes | The action to perform on custom fields | |
| offset | No | Number of results to skip (for list action) | |
| search | No | Search query (for list action) | |
| field_id | No | Field ID (required for get, update, delete, associate, disassociate) | |
| required | No | Whether field is required in fieldset (for associate action) | |
| field_data | No | Field data (required for create, optional for update) | |
| fieldset_id | No | Fieldset ID (required for associate/disassociate actions) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, and the description does not contradict this. It adds context about fieldset association requirements but does not detail potential side effects of delete or other mutations. The description adds some contextual value beyond annotations but lacks depth.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with an intro, action list, and return type. It is concise without being overly terse, though the first sentence is slightly redundant with the action list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 7 actions and 9 parameters, the description provides sufficient overview and prerequisites. The output schema exists, so return values are covered. It could add more on edge cases or destructive consequences, but overall it is complete enough for effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed descriptions, so the baseline is 3. The description adds value by explicitly stating that create requires field_data with name and element, which is not fully captured in the schema's optional subfields. Most other parameter semantics are already present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool manages Snipe-IT custom fields with CRUD operations and enumerates all seven actions. It distinguishes from sibling tools like manage_fieldsets by focusing specifically on custom fields rather than fieldsets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on when to use the tool (to manage custom fields) and includes important prerequisites like fields needing to be associated with fieldsets. However, it does not explicitly name alternatives or state when not to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of results to return (for list action) | |
| action | Yes | The action to perform on fieldsets | |
| offset | No | Number of results to skip (for list action) | |
| field_order | No | Ordered list of field IDs (for reorder action) | |
| fieldset_id | No | Fieldset ID (required for get, update, delete, fields, reorder) | |
| fieldset_data | No | Fieldset data (required for create, optional for update) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructive behavior (destructiveHint=true). The description adds context by listing delete and reorder actions and explaining the relationship between fieldsets and asset models, but does not detail side effects of deletion or modification on associated assets, which would be valuable beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with a clear opening statement, a brief conceptual paragraph, and a structured list of actions. It is moderately concise and each section earns its place, though the action list could be slightly more compact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-action CRUD tool, the description covers all actions and their key inputs and explains the domain concept. It includes a brief returns statement, and since an output schema exists, detailed return values are not required. It could be more complete with explicit fieldset_id requirements and potential side effects, but overall it is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds meaningful action-to-parameter mappings, such as requiring fieldset_data for create and field_order for reorder. It clarifies that fieldset_id is needed for get/update/delete/fields/reorder implicitly, and the schema's default null for fieldset_data is supplemented by the description's requirement statement.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Manage Snipe-IT fieldsets with CRUD operations,' which clearly states the tool's purpose and resource. It then lists specific actions (create, get, list, update, delete, fields, reorder) with brief explanations, distinguishing this from sibling tools like manage_fields by focusing on fieldsets as collections of fields.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool, including the role of fieldsets in asset models. It gives action-specific guidance, such as 'create requires fieldset_data with name' and 'reorder requires field_order list of field IDs,' but does not explicitly exclude alternative tools like manage_fields or provide when-not-to-use scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of results to return (for list action) | |
| action | Yes | The action to perform on groups | |
| offset | No | Number of results to skip (for list action) | |
| search | No | Search query (for list action) | |
| group_id | No | Group ID (required for get, update, delete) | |
| group_data | No | Group data (required for create, optional for update) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate destructive behavior (destructiveHint=true), and the description mentions the delete action. It adds useful context about cumulative permissions, but does not disclose potential side effects of deletion (e.g., effects on users) or any other operational details beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and concise, using a clear intro, context sentence, bullet-point action list, and return type. Every sentence adds value and there is no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has a full schema, annotations, and an output schema, so the description does not need to explain return values. It clearly lists all actions and their key parameters, making it fairly complete. Minor gaps remain around edge cases like deletion side effects, but overall it is sufficient for a CRUD tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All parameters are covered in the schema (100% coverage), so the baseline is 3. The description adds little beyond the schema, only restating that group_data is required for create and that update can modify permissions. No additional semantics are provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool manages Snipe-IT permission groups with CRUD operations, and the explicit action list (create, get, list, update, delete) leaves no ambiguity about the resource and operations. It distinguishes from sibling tools by focusing specifically on permission groups.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context about groups ('used to manage permissions for multiple users at once') and notes that permissions are cumulative, which implies when this tool is relevant. However, it does not explicitly compare with alternatives like manage_users or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_importsADestructive
Manage CSV import operations for bulk data import.
The import workflow is: upload → update mappings → process
Operations:
list: List all import files
get: Get import file details including column mappings
upload: Upload a CSV file for import
update: Update import column mappings and settings
delete: Delete an import file
process: Execute the import
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
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The import action to perform | |
| file_path | No | Path to CSV file (required for upload action) | |
| import_id | No | Import file ID (required for get, update, delete, process) | |
| import_data | No | Import configuration (for update action) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already include destructiveHint=true, and the description adds context by listing delete and process operations, plus a run_backup option to safeguard imports. It also explains the workflow, which goes beyond the annotation hints. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear opening sentence, a concise workflow, a bulleted operation list, and a relevant field mappings section. Every part adds useful information without redundancy, making it appropriately sized and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-action tool, the description provides a high-level overview, workflow, and field mappings while leveraging annotations and output schema. It lacks detailed per-action behavior or error handling, but overall it gives enough context for an agent to use the tool correctly. The presence of an output schema reduces the need to explain return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides descriptions for all parameters (100% coverage), so the baseline is 3. The description adds value by listing common field mappings for assets (e.g., asset_tag, name, serial) and clarifying the workflow, which helps interpret the field_map parameter beyond the schema's basic description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it manages CSV import operations for bulk data import, listing six specific actions (list, get, upload, update, delete, process). This specific verb+resource combination, with the workflow and operation list, distinguishes it from sibling tools that manage individual asset types or other features.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear workflow (upload → update mappings → process) and common field mappings for assets, giving practical context for when and how to use the tool. It doesn't explicitly state when not to use it or mention alternatives, but the workflow and field mappings offer strong usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Field to sort by (for list action): id, name, created_at, updated_at, created_by | |
| limit | No | Number of results to return (for list action) | |
| order | No | Sort order (for list action) | |
| action | Yes | The action to perform on predefined kits | |
| kit_id | No | Kit ID (required for all actions except create and list) | |
| offset | No | Number of results to skip (for list action) | |
| search | No | Search query (for list action) | |
| item_id | No | ID of the model/license/accessory/consumable (required for add_item, update_item, remove_item) | |
| kit_data | No | Kit data (required for create, optional for update) | |
| quantity | No | Quantity of the item in the kit (for add_item, update_item) | |
| item_type | No | Kit content type (required for list_items, add_item, update_item, remove_item) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal destructive and non-read-only behavior, and the description adds meaningful behavioral context beyond those flags: there is no API endpoint for kit checkout, and items are attached/detached individually. It also explains what each content operation does at a behavioral level. It does not claim any contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a short intro, bullet-style CRUD and kit-content sections, and a crucial note. It is compact for the number of actions and parameters it covers. The redundant 'Returns: dict' section slightly reduces efficiency because the availability of an output schema already covers return shape.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter, 9-action tool, the description covers the key combinations of action, kit_id, item_type, item_id, and kit_data accurately. A clear omission is naming which sibling checkout tools should be used after listing items, but the description provides enough to call the tool safely. No important behavioral or workflow gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the input schema already documents each parameter. The description adds value by grouping parameters by action, e.g., 'requires kit_id and item_type' for content operations and 'requires item_id; optional quantity' for add_item. This action-to-parameter mapping is useful because the schema alone does not aggregate requirements by action.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool manages Snipe-IT predefined kits, which are bundles of models/licenses/accessories/consumables, and enumerates the exact CRUD and content operations. The phrase 'Manage' plus the operation list distinguishes it from related tools like manage_assets or manage_licenses.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly maps actions to the parameters they require, so an agent can select the correct action. It also includes an important exclusion: kit checkout is not available via API and must be done by listing items and checking them out individually. It does not name explicit alternative sibling tools, but the usage guidance is strong enough for action selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Field to sort by (for list action) | |
| limit | No | Number of results to return (for list action) | |
| order | No | Sort order (for list action) | |
| action | Yes | The action to perform on licenses | |
| offset | No | Number of results to skip (for list action) | |
| search | No | Search query (for list action) | |
| license_id | No | License ID (required for get, update, delete) | |
| license_data | No | License data (required for create, optional for update) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false. The description adds no further side-effect information beyond what the schema and annotations provide; the 'Returns' line is redundant given the output schema. No contradiction, but minimal added behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured, with a concise intro, a clearly formatted list of operations, and a short return note. It is appropriately sized for a multi-action CRUD tool, with no unnecessary filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (multi-action, many parameters), the description effectively covers each action's required inputs and highlights list pagination/filtering. The output schema and annotations handle return values and safety, so the description is reasonably complete despite not covering error handling or cross-tool relationships.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by specifying that create requires license_data with name and seats, and by mapping each action to the required parameters, which the schema's optional defaults do not fully convey. This goes beyond simply restating parameter names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States 'Manage Snipe-IT licenses with CRUD operations' and enumerates the five CRUD actions (create, get, list, update, delete). This clearly identifies the tool's scope and distinguishes it from sibling tools like license_seats or asset_licenses, which handle more specific license-related operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The operation list provides explicit context for when to use each action, including required parameters for create/update/delete. However, it does not explicitly contrast with sibling tools like license_seats or asset_licenses, so it stops short of full usage differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Field to sort by (for list action) | |
| limit | No | Number of results to return (for list/assets/users actions) | |
| order | No | Sort order (for list action) | |
| action | Yes | The action to perform on locations | |
| offset | No | Number of results to skip (for list/assets/users actions) | |
| search | No | Search query (for list action) | |
| location_id | No | Location ID (required for get, update, delete, assets, users) | |
| location_data | No | Location data (required for create, optional for update) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructive behavior (destructiveHint=true), so the description does not need to repeat that. However, it adds no additional behavioral context such as side effects of deleting a location, permission requirements, irreversibility, or implications for associated assets. The description mostly restates action outcomes ('delete: Delete a location') without deeper disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with a brief intro, a bulleted list of operations, and a return-type statement. It is front-loaded with the tool's purpose and uses compact phrasing. No wasted sentences, though the operations list is somewhat lengthy but necessary for clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complex multi-action tool and rich schema/annotations, the description covers all operations with their required parameters and a return-type summary. It does not explain edge cases like pagination or sorting nuances, but the schema covers those details. It lacks explicit usage guidance but is otherwise complete for selecting actions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% parameter description coverage, so the baseline is 3. The description adds useful per-action requirements, notably that create requires location_data with name and that assets/users require location_id. However, it states update 'requires location_id and location_data', which contradicts the schema's 'optional for update' designation, creating potential confusion for agents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool manages Snipe-IT locations and enumerates CRUD operations plus asset/user listing. While the verb 'Manage' is broad, the operation list provides specific actions and the resource 'locations' distinguishes it from sibling tools like manage_assets and manage_users.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for location management with a brief context sentence ('Locations represent physical places where assets are stored or deployed'), and the operation list suggests when to use each action. However, it does not explicitly state when to use this tool versus alternatives or provide exclusions for other resource-specific tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Field to sort by (for list action) | |
| limit | No | Number of results to return (for list action) | |
| order | No | Sort order (for list action) | |
| action | Yes | The action to perform on manufacturers | |
| offset | No | Number of results to skip (for list action) | |
| search | No | Search query (for list action) | |
| manufacturer_id | No | Manufacturer ID (required for get, update, delete) | |
| manufacturer_data | No | Manufacturer data (required for create, optional for update) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, and the description adds the CRUD operation breakdown and return format. It does not disclose additional behavioral details such as cascading deletes, authentication requirements, or partial update semantics, so it only partially supplements the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded, with a clear purpose, context, bulleted operations, and a returns section. Every sentence adds value without unnecessary filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter CRUD tool, the description covers all actions and their required parameters, and the output schema handles return details. It lacks guidance on when to use alternatives and error handling, but overall it is sufficiently complete for selecting and invoking the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds valuable nuance by stating that create requires manufacturer_data with name, which is not explicit in the schema's optional name field. It also summarizes list filtering and pagination, making parameter usage clearer.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool manages Snipe-IT manufacturers with CRUD operations and enumerates specific actions. It is unambiguous about the resource and actions, though it doesn't explicitly differentiate from sibling tools like manage_suppliers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides per-action usage details and required parameters, implying when to use the tool. However, it doesn't explicitly mention when not to use it or point to alternatives (e.g., manage_suppliers for suppliers), so the guidance is only implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Field to sort by (for list action) | |
| limit | No | Number of results to return (for list/assets actions) | |
| order | No | Sort order (for list action) | |
| action | Yes | The action to perform on asset models | |
| offset | No | Number of results to skip (for list/assets actions) | |
| search | No | Search query (for list action) | |
| model_id | No | Model ID (required for get, update, delete, assets) | |
| model_data | No | Model data (required for create, optional for update) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, so agents know this tool can be destructive. The description adds that delete is an operation and lists required IDs, but does not go beyond that to explain side effects (e.g., whether associated assets are affected) or authentication needs. It does not contradict annotations, but adds limited behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with a clear lead sentence, a bulleted list of operations, and a return-value note. It is succinct, front-loaded with the tool's purpose, and every line contributes operational value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (8 parameters, 6 actions, output schema present), the description covers all actions and required parameters, plus it mentions the return format. It does not detail pagination/filtering behaviors for list/assets, but those are already covered by the schema, so the description is comprehensive for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While the schema has 100% parameter description coverage, the description adds operational nuance beyond the schema—notably that 'create' requires model_data with name and category_id, and that model_id is needed for get/update/delete/assets. This helps the agent avoid invalid calls and is value-add over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description explicitly states 'Manage Snipe-IT asset models with CRUD operations' and enumerates all six supported actions with required parameters, clearly distinguishing this tool from sibling tools like manage_assets and manage_categories. The resource scope is unambiguous and operationally detailed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool (any CRUD operation on asset models) but does not explicitly name alternative tools or exclusion criteria. The resource definition implies when it is the right choice, so this is a solid 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Field to sort by (for list action) | |
| limit | No | Number of results to return (for list/assets actions) | |
| order | No | Sort order (for list action) | |
| action | Yes | The action to perform on status labels | |
| offset | No | Number of results to skip (for list/assets actions) | |
| search | No | Search query (for list action) | |
| status_label_id | No | Status label ID (required for get, update, delete, assets) | |
| status_label_data | No | Status label data (required for create, optional for update) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare the tool potentially destructive, and the description adds useful action-level context by showing that delete is the destructive action while create/get/list/update are not. It does not, however, disclose potential side effects (e.g., deleting a label in use) or permissions beyond what the schema and annotations imply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a concise summary, a domain context sentence, and a bulleted operation list. It is slightly redundant with the schema's parameter descriptions, but it remains efficiently organized and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (6 actions, 8 parameters) and the presence of an output schema, the description covers all actions and their core requirements. It lacks nuanced details about error handling, edge cases, or dependencies, but the provided information is sufficient for basic tool selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already has 100% description coverage, but the description adds meaning by stating that create requires status_label_data with name and type, and that update requires both status_label_id and status_label_data. This clarifies action-specific parameter requirements that are not fully expressed in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource (Snipe-IT status labels) and enumerates the CRUD actions plus an 'assets' action, so the agent knows exactly what operations are available. 'Manage' is a generic verb, but the explicit operation list removes ambiguity and distinguishes this tool from other asset-related siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context that status labels define asset states, helping the agent infer when this tool is relevant. However, it does not explicitly mention alternatives, exclusions, or when to choose a different tool such as status_summary or manage_assets.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Field to sort by (for list action) | |
| limit | No | Number of results to return (for list action) | |
| order | No | Sort order (for list action) | |
| action | Yes | The action to perform on suppliers | |
| offset | No | Number of results to skip (for list action) | |
| search | No | Search query (for list action) | |
| supplier_id | No | Supplier ID (required for get, update, delete) | |
| supplier_data | No | Supplier data (required for create, optional for update) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the tool's destructive nature via the 'delete' action, consistent with destructiveHint=true annotation, and adds context by clarifying what suppliers are (vendors). It also states the return type (dict with success status and data). While not detailing permissions or irreversibility, the annotation already covers the destructive aspect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear summary, a brief domain explanation, a bulleted list of operations, and a return type. Every sentence serves a purpose, and it remains concise without unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-action CRUD tool, the description covers all operations, parameter requirements, and return type, which is sufficient for an agent to select and invoke it. However, it does not specify nuances like whether update is partial or full replacement, leaving a slight gap in completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The parameters are fully described in the schema, but the description adds valuable semantics by specifying that create requires 'supplier_data' with 'name' and that update needs both 'supplier_id' and 'supplier_data'. This goes beyond the schema's generic field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool manages Snipe-IT suppliers with CRUD operations, enumerating all five actions (create, get, list, update, delete). This differentiates it from sibling tools like manage_assets or manage_consumables by specifically targeting suppliers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for each action, including required parameters (e.g., 'create requires supplier_data with name', 'get, update, delete require supplier_id'). However, it does not explicitly mention alternatives or when not to use this tool, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Field to sort by (for list action) | |
| No | Email for exact match (for list action) | ||
| limit | No | Number of results to return (for list action) | |
| order | No | Sort order (for list action) | |
| action | Yes | The action to perform on users | |
| offset | No | Number of results to skip (for list action) | |
| search | No | Search query (for list action) | |
| user_id | No | User ID (required for get, update, delete, restore) | |
| username | No | Username for exact match (for list action) | |
| user_data | No | User data (required for create, optional for update) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already indicating destructiveHint=true and readOnlyHint=false, the description adds value by revealing the soft-delete behavior through the 'restore' action and by noting that delete requires user_id. It does not introduce contradictions, and the inclusion of restore is a meaningful behavioral detail beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a short introductory sentence, a clear bulleted action list, and a brief return note. It is somewhat longer than the minimum needed but every part serves a purpose, so it earns a 4.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 actions, 10 parameters), the description covers all actions, required parameters, and the return type. It does not mention pagination defaults or edge cases, but the schema and output schema fill in those details, making this sufficiently complete for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and each parameter already has a description indicating which actions it applies to (e.g., user_id is 'required for get, update, delete, restore'). The description's bullet list mostly rephrases this mapping without adding new semantic content, so it stays at the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Manage Snipe-IT users with CRUD operations' and then enumerates all seven actions (create, get, list, update, delete, restore, me). This specific verb+resource combination, along with the exhaustive action list, fully distinguishes it from sibling tools like user_two_factor and user_assets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'This tool handles all user operations' gives clear context for when to use it, and the bullet list further specifies each action's purpose. However, it does not explicitly mention alternatives or when not to use it (e.g., when to use user_two_factor instead), so it lacks the explicit exclusion/alternative guidance needed for a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The file operation to perform | |
| file_id | No | File ID (required for download and delete actions) | |
| model_id | Yes | Model ID | |
| file_path | No | File path to upload (for upload action) | |
| save_path | No | Path to save downloaded file (for download action) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the agent knows this is a write-capable tool with destructive operations. The description adds the scope of files (model-level) but does not disclose additional behavioral traits such as whether deletion is permanent, whether uploads overwrite existing files, or any permission requirements. It neither contradicts nor richly extends the annotations, so a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and concise. It opens with a clear verb+resource statement, provides a brief explanatory line, then presents operations as a bulleted list. The Returns section is useful. No wasted words; every sentence contributes to understanding functionality.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema and annotations, the description covers the essential aspects: purpose, operations, and a return summary. It could add a note about permission requirements or error handling, but the schema and annotations fill in most gaps. For a multi-action file management tool, this is a strong description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter has a description (action enum, file_id, model_id, file_path, save_path). The description lists operations but does not add significant meaning beyond the schema—e.g., it doesn't clarify relationships between actions and required params beyond what the schema already states. Baseline of 3 is correct since the schema carries the parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool manages file attachments for asset models, with a specific verb ('Manage') and resource ('asset models'). It lists four distinct operations (upload, list, download, delete), making its purpose unambiguous. It distinguishes from sibling tools by explicitly scoping to model-level attachments, which is distinct from asset_files or license_files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use the tool: for files that apply to all assets of a model (documentation, manuals, datasheets, images). It implies these are model-level attachments, differentiating from asset-level or license-level files. However, it does not explicitly state when not to use this tool or mention alternatives, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the description doesn't need to disclose safety. It adds a useful behavioral detail by specifying the return type as a dict, which goes beyond the annotations. No auth or rate limit info is needed given the tool's simple read-only nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded, with the main action in the first sentence. The second sentence adds context, and the 'Returns:' line repeats a bit of what the output schema likely provides, but it isn't bloated. It earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only tool with an output schema present, the description is fully complete. It explains what the tool returns and why it's useful, leaving no important gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, so the baseline is 4. The description doesn't need to explain any parameters. It adds no parameter info, but none is required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb+resource construction: 'Get asset counts grouped by status label.' This clearly distinguishes it from sibling tools like manage_status_labels or asset_labels, which focus on managing labels rather than summarizing counts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear usage context ('useful for dashboard displays and reporting') but does not explicitly mention alternatives or exclusion scenarios. This is sufficient for a simple read-only summary tool, but it lacks an explicit 'use this instead of X' or 'when not to use' clause.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool as read-only, idempotent, and non-destructive. The description adds meaningful context about the return value (version and installation details) and its use cases, without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, front-loaded with the core purpose, and uses a clear structure with a Returns section. Every sentence earns its place without unnecessary verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, parameterless read-only tool with rich annotations and an output schema, the description fully covers what the tool does, what it returns, and when to use it. There are no gaps in context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the description need not explain parameter behavior. The baseline for zero parameters is 4, and the description does not mislead or omit anything relevant.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get Snipe-IT system information' with a specific verb and resource, and elaborates that it 'Returns version and installation details.' This distinguishes it from sibling tools, which are all management/operation-focused.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for use: 'Useful for compatibility checking and deployment verification.' It does not explicitly mention alternatives or exclusions, but given the tool's unique purpose, the usage context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | Yes | User ID | |
| asset_type | No | Type of items to retrieve | all |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, covering the safety profile. The description adds valuable context beyond annotations: it explains the semantic difference between 'all' and other options, clarifies that 'eulas' returns items requiring user acceptance via web portal, and gives a return type. This goes beyond basic read-only behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear introductory sentence, a bulleted list of options, a note, and a returns section. It is not excessively verbose and all content is relevant. Minor redundancy with the schema's enum list, but it improves clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 parameters, 1 required) and the presence of an output schema and safety annotations, the description sufficiently covers behavior. It explains all options, the special eulas case, and the return type. It does not mention edge cases like pagination or empty results, but these are less critical for a retrieval tool with clear annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for both user_id and asset_type. The description adds extra meaning by listing and explaining each enum value (assets, accessories, licenses, consumables, eulas, all) and the note about eulas, which goes beyond the schema's terse 'Type of items to retrieve'. This enrichment compensates for the minimal schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function with a specific verb and resource: 'Get items checked out to a user.' It enumerates the types of items (assets, accessories, licenses, consumables, eulas) and explicitly differentiates from sibling management tools by focusing on retrieval. The 'Note' about eulas further clarifies the scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly guides usage by explaining the available asset_type options and the purpose of each (e.g., 'eulas' for pending acceptances). However, it does not explicitly state when to use this tool versus alternatives like manage_assets or asset_operations. Clear context but no explicit exclusions or alternative recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The 2FA action to perform | |
| user_id | Yes | User ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true and readOnlyHint=false. The description adds meaningful context: resetting 2FA forces re-enrollment and is security-sensitive, which goes beyond the raw annotation flags. No contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured with an operations list and a note, but contains some redundancy. The 'Returns' section is unnecessary given an output schema exists, and the second sentence ('Administrative functions...') repeats the initial purpose. Could be tightened without loss.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only two parameters and an output schema, the description covers the operation, its security impact, and the re-enrollment consequence. It lacks explicit permission requirements, but the 'administrative' label provides sufficient context for an agent to understand usage boundaries.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers both parameters with descriptions (100% coverage). The description adds the behavioral effect of the 'action' parameter (reset) and what it means for the user, enriching the schema's minimal 'The 2FA action to perform' with concrete consequences.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it manages user two-factor authentication and specifically lists the 'reset' operation with its effect ('requiring them to re-enroll'). This distinguishes it from sibling tools like manage_users or user_assets, which handle broader user/asset management.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description notes this is an administrative function affecting user security, implying it should be used with caution and by authorized admins. It does not explicitly mention alternatives, but the operation is narrowly scoped to 2FA resets, making usage context clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v1.6.1- Changed
asset_maintenance20 fields changed- removed
Input schema / properties / action / constRemoved value: -"create" - changed
Input schema / properties / action / descriptionPrevious value: -"The maintenance operation to perform (currently only create is supported)"New value: +"The maintenance operation to perform" - added
Input schema / properties / action / enumAdded value: +[ + "create", + "list", + "get", + "update", + "delete", + "complete" +] - added
Input schema / properties / asset_id / anyOfAdded value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / asset_id / defaultAdded value: +null - changed
Input schema / properties / asset_id / descriptionPrevious value: -"Asset ID"New value: +"Asset ID (required for create; optional filter for list)" - removed
Input schema / properties / asset_id / typeRemoved value: -"integer" - added
Input schema / properties / completedAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Filter by completion state (for list action)" +} - added
Input schema / properties / limitAdded value: +{ + "default": 50, + "description": "Number of results to return (for list action)", + "type": "integer" +} - added
Input schema / properties / maintenance_data / anyOfAdded value: +[ + { + "description": "Model for asset maintenance records.", + "properties": { + "asset_improvement": { + "description": "Type of maintenance/improvement", + "type": "string" + }, + "completion_date": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Completion date (YYYY-MM-DD)" + }, + "cost": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Maintenance cost" + }, + "notes": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Maintenance notes" + }, + "start_date": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Start date (YYYY-MM-DD)" + }, + "supplier_id": { + "description": "Supplier ID", + "type": "integer" + }, + "title": { + "description": "Maintenance title", + "type": "string" + } + }, + "required": [ + "asset_improvement", + "supplier_id", + "title" + ], + "type": "object" + }, + { + "type": "null" + } +] - added
Input schema / properties / maintenance_data / defaultAdded value: +null - removed
Input schema / properties / maintenance_data / propertiesRemoved value: -{ - "asset_improvement": { - "description": "Type of maintenance/improvement", - "type": "string" - }, - "completion_date": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Completion date (YYYY-MM-DD)" - }, - "cost": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Maintenance cost" - }, - "notes": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Maintenance notes" - }, - "start_date": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Start date (YYYY-MM-DD)" - }, - "supplier_id": { - "description": "Supplier ID", - "type": "integer" - }, - "title": { - "description": "Maintenance title", - "type": "string" - } -} - removed
Input schema / properties / maintenance_data / requiredRemoved value: -[ - "asset_improvement", - "supplier_id", - "title" -] - removed
Input schema / properties / maintenance_data / typeRemoved value: -"object" - added
Input schema / properties / maintenance_idAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Maintenance record ID (required for get, update, delete, complete)" +} - added
Input schema / properties / noteAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Completion note (for complete action)" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (for list action)", + "type": "integer" +} - added
Input schema / properties / searchAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Search query (for list action)" +} - added
Input schema / properties / update_dataAdded value: +{ + "anyOf": [ + { + "description": "Model for partial updates to maintenance records (all fields optional).", + "properties": { + "asset_improvement": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Type of maintenance/improvement" + }, + "completion_date": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Completion date (YYYY-MM-DD)" + }, + "cost": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Maintenance cost" + }, + "is_warranty": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Whether covered under warranty" + }, + "notes": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Maintenance notes" + }, + "start_date": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Start date (YYYY-MM-DD)" + }, + "supplier_id": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Supplier ID" + }, + "title": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Maintenance title" + } + }, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Fields to change (required for update action)" +} - changed
Input schema / requiredPrevious value: -[ - "action", - "asset_id", - "maintenance_data" -]New value: +[ + "action" +]
- Changed
asset_requests9 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "request", - "cancel" -]New value: +[ + "request", + "cancel", + "list", + "requestable" +] - added
Input schema / properties / asset_id / anyOfAdded value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / asset_id / defaultAdded value: +null - changed
Input schema / properties / asset_id / descriptionPrevious value: -"Asset ID (must be a requestable asset)"New value: +"Asset ID (required for request and cancel; must be a requestable asset)" - removed
Input schema / properties / asset_id / typeRemoved value: -"integer" - added
Input schema / properties / limitAdded value: +{ + "default": 50, + "description": "Number of results to return (for requestable action)", + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (for requestable action)", + "type": "integer" +} - added
Input schema / properties / searchAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Search query (for requestable action)" +} - changed
Input schema / requiredPrevious value: -[ - "action", - "asset_id" -]New value: +[ + "action" +]
- Added
bulk_asset_operations - Added
manage_kits
38 tool updates
v1.6.0- First observed
accessory_operations - First observed
activity_reports - First observed
asset_files - First observed
asset_labels - First observed
asset_licenses - First observed
asset_maintenance - First observed
asset_operations - First observed
asset_requests - First observed
audit_tracking - First observed
component_operations - First observed
ldap_operations - First observed
license_files - First observed
license_seats - First observed
manage_accessories - First observed
manage_assets - First observed
manage_backups - First observed
manage_categories - First observed
manage_companies - First observed
manage_components - First observed
manage_consumables - First observed
manage_departments - First observed
manage_depreciations - First observed
manage_fields - First observed
manage_fieldsets - First observed
manage_groups - First observed
manage_imports - First observed
manage_licenses - First observed
manage_locations - First observed
manage_manufacturers - First observed
manage_models - First observed
manage_status_labels - First observed
manage_suppliers - First observed
manage_users - First observed
model_files - First observed
status_summary - First observed
system_info - First observed
user_assets - First observed
user_two_factor
TDQS
Scored across 40 tools
The manage_* CRUD tools are clearly separated by resource, but the asset domain is split across many tools (manage_assets, asset_operations, bulk_asset_operations, asset_maintenance, asset_files, asset_licenses, asset_requests) and audit/reporting tools (audit_tracking, status_summary) overlap in purpose. Descriptions are detailed enough to recover, but an agent could easily pick the wrong tool for an audit, status, or license-assignment task.
The 21 manage_<resource> tools establish a clear CRUD convention, and patterns like <resource>_operations, <resource>_files, and license_seats provide additional structure. However, reporting/utility tools use inconsistent noun/gerund forms (audit_tracking, status_summary, system_info, activity_reports, asset_requests) rather than a uniform verb-based convention.
40 tools is well beyond the 16-25 range the rubric considers heavy, even though Snipe-IT is a broad domain. The repeated CRUD sub-operations could be consolidated into fewer parameterized tools or grouped by resource without sacrificing coverage.
The server covers CRUD and lifecycle/state operations for nearly every Snipe-IT entity: assets, accessories, consumables, components, licenses, users, locations, and supporting data. The only notable gaps are operations the API itself does not expose (request approval, kit checkout, backup creation), so agents face a few web-only dead ends rather than missing core coverage.
Maintenance
Related MCP Connectors
- mcp-serverOAuthcom.make
Give your AI agents the tools to build, manage, and run automation workflows.
Discover, inspect and run 63,000+ agent tools from one balance. Pay per call, no subscriptions.
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.
60+ Meta Ads tools for AI agents: audits, campaign management, audiences and CAPI tracking.
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.53291MIT
- AlicenseBqualityAmaintenanceEnables AI agents to interact with the Shopmonkey REST API to manage shop management data including work orders, customers, vehicles, and inventory. It provides 33 tools across 9 resource groups with built-in support for rate limiting, concurrency control, and multi-location management.692MIT
- AlicenseCqualityCmaintenanceProvides AI assistants with direct access to Autotask PSA for MSP operations. Enables natural language interaction for ticket management, time logging, company lookups, project tracking, and billing review through 39 comprehensive tools.10017Apache 2.0