Skip to main content
Glama
mhajder

NetBox MCP Server

by mhajder

NetBox MCP Server

NetBox MCP Server is a Python-based Model Context Protocol (MCP) server that gives AI assistants structured access to NetBox - the source of truth for network infrastructure (DCIM and IPAM). A small set of generic tools covers all 139 core object types of NetBox 4.7 (and plugin types, if enabled), plus specialised tools for search, change logs, GraphQL, free IP/prefix/VLAN allocation, cable tracing, config rendering and (optionally) netbox-branching. Writes can be hidden entirely (read-only mode) or simulated (dry-run mode).

Features

Core Features

  • Query any NetBox object type with filtering, ordering and pagination through one tool

  • Keep responses small with fields, omit and brief - the tools steer the model to use them

  • Search many object types at once, with explicit reporting of failed and truncated types

  • Read the change log (who changed what, when) and NetBox status/version/plugins

  • Run read-only GraphQL queries for nested data in one round trip

  • List free IPs, prefixes, VLANs and ASNs; trace cable paths; render device configs

Management Operations

  • Create, update and delete any object type, singly or in bulk (NetBox runs a bulk write as one transaction)

  • Allocate the next free IP, prefix, VLAN or ASN atomically

  • Optionally stage changes in a netbox-branching branch instead of main

  • Describe an object type's writable fields and choices before writing

Advanced Capabilities

  • Read-only mode hides every write tool; dry-run mode turns every write into a preview

  • NetBox v2 (Bearer nbt_...) and legacy v1 (Token ...) API tokens

  • Plugin object type discovery (e.g. netbox_dns.zone)

  • Filter validation that rejects filters NetBox would silently ignore (__in, multi-hop lookups)

  • Retries on 429/5xx without ever replaying a create after a server error

  • Tag-based tool filtering, optional tool-search transform, rate limiting and response size limit

  • Bearer token authentication for HTTP transport

  • Multiple transport options (STDIO, SSE, HTTP)

  • Optional Sentry integration for error tracking

Related MCP server: NetBox MCP Server - Read & Write Edition

Installation

Prerequisites

  • Python 3.11 to 3.15

  • A NetBox instance, version 4.2 or newer. Features added later (omit, v2 tokens, /api/authentication-check/) are used when the server detects them

  • A NetBox API token with the permissions you want the assistant to have. The token is the real security boundary: a read-only token cannot write, whatever this server's settings are

Quick Install from PyPI

The easiest way to get started is to install from PyPI:

# Using UV (recommended)
uvx netbox-mcp

# Or using pip
pip install netbox-mcp

Remember to configure the environment variables for your NetBox instance before running the server:

# Create environment configuration
export NETBOX_URL=https://netbox.example.com
export NETBOX_TOKEN=nbt_your-key.your-token

Install from Source

  1. Clone the repository:

git clone https://github.com/mhajder/netbox-mcp.git
cd netbox-mcp
  1. Install dependencies:

# Using UV (recommended)
uv sync

# Or using pip
pip install -e .
  1. Configure environment variables:

cp .env.example .env
# Edit .env with your NetBox URL and API token
  1. Run the server:

# Using UV (recommended)
uv run netbox-mcp

# Or using the installed command directly
netbox-mcp

Using Docker

A Docker image is available on GitHub Packages for easy deployment.

docker pull ghcr.io/mhajder/netbox-mcp:latest

Development Setup

For development with additional tools:

# Clone and install with development dependencies
git clone https://github.com/mhajder/netbox-mcp.git
cd netbox-mcp
uv sync --group dev

# Run tests
uv run pytest

# Run with coverage
uv run pytest --cov=src/

# Run linting and formatting
uv run ruff check .
uv run ruff format .

# Run type checking
uv run ty check .

# Setup prek hooks
uv run prek install

Configuration

Environment Variables

# NetBox MCP Server Environment Configuration

# NetBox Connection Details
NETBOX_URL=https://netbox.example.com

# API Token - v2 tokens (nbt_<key>.<token>, NetBox 4.5+) are sent as "Bearer",
# legacy v1 tokens as "Token"
NETBOX_TOKEN=nbt_your-key.your-token

# SSL Configuration
NETBOX_VERIFY_SSL=true
# Total time allowed for one NetBox request, retries included (seconds)
NETBOX_TIMEOUT=30

# Branching (requires the netbox-branching plugin)
# Set NETBOX_BRANCHING_ENABLED true to add the branch tools and the 'branch'
# argument to every tool. Off by default - leave it off on a NetBox without the plugin
NETBOX_BRANCHING_ENABLED=false
# Default branch (name or schema ID) used by every call; empty = main.
# Requires NETBOX_BRANCHING_ENABLED=true
NETBOX_BRANCH=

# Plugin Discovery
# Set NETBOX_PLUGIN_DISCOVERY true to expose plugin models (e.g. netbox_dns.zone)
NETBOX_PLUGIN_DISCOVERY=false

# Read-Only Mode
# Set READ_ONLY_MODE true to hide all write tools (create, update, delete)
READ_ONLY_MODE=false

# Dry-Run Mode
# Set DRY_RUN_MODE true to make every write tool only simulate the change:
# it returns the request it would send and never modifies NetBox
DRY_RUN_MODE=false

# Disabled Tags
# Comma-separated list of tags to disable tools for (empty by default)
# Example: DISABLED_TAGS=delete,graphql,branching
DISABLED_TAGS=

# Logging Configuration
LOG_LEVEL=INFO

# Response Size Limit
# Maximum tool response size in bytes; larger responses are truncated (empty = unlimited)
RESPONSE_MAX_SIZE=

# Rate Limiting
# Set RATE_LIMIT_ENABLED true to enable rate limiting
RATE_LIMIT_ENABLED=false
RATE_LIMIT_MAX_REQUESTS=60
RATE_LIMIT_WINDOW_MINUTES=1

# Tool Search Transform (Optional)
# Set TOOL_SEARCH_ENABLED true to replace full tool listings with search_tools + call_tool
TOOL_SEARCH_ENABLED=false
# Search strategy: bm25 (natural language) or regex (pattern match)
TOOL_SEARCH_STRATEGY=bm25
# Maximum number of tools returned by search_tools
TOOL_SEARCH_MAX_RESULTS=5

# Sentry Error Tracking (Optional)
# Set SENTRY_DSN to enable error tracking and performance monitoring
# SENTRY_DSN=https://your-key@o12345.ingest.us.sentry.io/6789
# Optional Sentry configuration
# SENTRY_TRACES_SAMPLE_RATE=1.0
# SENTRY_SEND_DEFAULT_PII=false
# SENTRY_ENVIRONMENT=production
# SENTRY_RELEASE=1.2.3
# SENTRY_PROFILE_SESSION_SAMPLE_RATE=1.0
# SENTRY_PROFILE_LIFECYCLE=trace
# SENTRY_ENABLE_LOGS=true

# MCP Transport Configuration
# Transport type: 'stdio' (default), 'sse' (Server-Sent Events), or 'http' (HTTP Streamable)
# 'streamable-http' is accepted as an alias for 'http'. Any other value stops
# the server at startup.
# MCP_TRANSPORT=stdio

# HTTP Transport Settings (used when MCP_TRANSPORT=sse or MCP_TRANSPORT=http)
# Host to bind the HTTP server (default: 127.0.0.1)
# MCP_HTTP_HOST=127.0.0.1
# Port to bind the HTTP server (default: 8000)
# MCP_HTTP_PORT=8000
# Optional bearer token for authentication (leave empty for no auth)
# MCP_HTTP_BEARER_TOKEN=
# Set NETBOX_TOKEN_PASSTHROUGH true to make every client authenticate with its own
# NetBox API token (Authorization: Bearer <token>); NetBox then applies that user's
# permissions. NETBOX_TOKEN is ignored. Cannot be combined with MCP_HTTP_BEARER_TOKEN
# NETBOX_TOKEN_PASSTHROUGH=false

Available Tools

Object types are named app.model, as NetBox itself names them (dcim.device, ipam.prefix, virtualization.virtualmachine). API paths such as dcim/devices are accepted too. With branching enabled, every tool that reads or writes objects also takes an optional branch argument.

Objects (read)

Tool

Description

netbox_list_object_types

List supported object types and their endpoints (core and discovered plugin types)

netbox_get_objects

List objects of a type with filters, fields, omit, brief, ordering, limit, offset

netbox_get_object

Get one object by ID

netbox_search_objects

Free-text search (q) across several object types at once

netbox_describe_object_type

Writable fields of a type: data type, required, choices

netbox_get_changelogs

Change log entries, newest first

Specialised (read)

Tool

Description

netbox_get_status

NetBox version, plugins, workers, authenticated user and this server's modes

netbox_graphql_query

Read-only GraphQL query (mutations are rejected)

netbox_get_available

Free IPs / prefixes in a prefix or IP range, VLANs in a VLAN group, ASNs in an ASN range

netbox_trace_cable

Full cable path from an interface, front/rear/console/power port or circuit termination

netbox_render_config

Render a device's or VM's configuration from its config template

netbox_list_branches

List netbox-branching branches (only with NETBOX_BRANCHING_ENABLED=true)

Write

Tool

Description

netbox_create_object

Create one object

netbox_update_object

Partially update one object (PATCH)

netbox_bulk_create_objects

Create up to 500 objects in one transaction

netbox_bulk_update_objects

Update up to 500 objects in one transaction

netbox_allocate_available

Allocate the next free IP, prefix, VLAN or ASN

netbox_create_branch

Create a netbox-branching branch (only with NETBOX_BRANCHING_ENABLED=true)

netbox_delete_object

Delete one object (destructiveHint)

netbox_bulk_delete_objects

Delete up to 500 objects in one transaction (destructiveHint)

Tool Tags

Every tool is tagged netbox plus a group tag, which DISABLED_TAGS can switch off: objects, search, changelog, status, graphql, ipam, dcim, config, branching, write and delete. Read tools also carry read-only.

Security & Safety Features

Read-Only Mode

Read-only mode hides every write tool - the client only sees the 11 read tools (12 with branching enabled):

READ_ONLY_MODE=true

Dry-Run Mode

Dry-run mode keeps the write tools visible, but none of them changes NetBox. Each one resolves and validates its target, then returns the request it would have sent, flagged "dry_run": true. Updates and deletes also fetch the current object, so the preview shows the values that would change and exactly what would be deleted:

DRY_RUN_MODE=true

READ_ONLY_MODE takes precedence: when both are set, write tools are hidden.

NetBox Branching

With the netbox-branching plugin, changes can be staged in a branch and reviewed before they are merged into main. Branching support is off by default, so a NetBox without the plugin gets no branch tools and no branch argument. Enable it with:

NETBOX_BRANCHING_ENABLED=true

This adds netbox_list_branches and netbox_create_branch, and a branch argument (a branch name or its schema ID) to every other tool. To send every call to one branch by default:

NETBOX_BRANCH=assistant-changes

Setting NETBOX_BRANCH without NETBOX_BRANCHING_ENABLED=true is a configuration error: the server refuses to start rather than silently writing to main.

Branch names are resolved to the schema ID that the X-NetBox-Branch header needs. Merging, syncing and reverting are deliberately not exposed as tools - they belong in a human review step.

Plugin Discovery

NETBOX_PLUGIN_DISCOVERY=true

The first time a call names an unknown type (or netbox_list_object_types runs), the server reads /api/core/object-types/ and adds every plugin model with a REST endpoint (for example netbox_dns.zone). Plugin types never shadow core types. If discovery fails, the core types keep working.

Tag-Based Tool Filtering

You can disable specific categories of tools by setting disabled tags. For example, allow creates and updates but never deletes:

DISABLED_TAGS=delete

Response Size Limit

Large NetBox objects add up quickly. RESPONSE_MAX_SIZE truncates any tool response above the given number of bytes:

RESPONSE_MAX_SIZE=200000

Tool Search for Large Toolsets

FastMCP tool search can reduce prompt size for servers with many tools. When enabled, list_tools returns two synthetic tools:

  • search_tools: Finds matching tools and returns their full schemas

  • call_tool: Executes any discovered tool by name

Enable it with:

TOOL_SEARCH_ENABLED=true
TOOL_SEARCH_STRATEGY=bm25      # bm25 or regex
TOOL_SEARCH_MAX_RESULTS=8      # optional, default is 5

bm25 supports natural language queries, while regex uses a regex pattern input for deterministic matching.

Tool search respects existing visibility controls (read-only mode and disabled tags).

Rate Limiting

The server supports rate limiting to control API usage and prevent abuse. If enabled, requests are limited per client using a sliding window algorithm.

Enable rate limiting by setting the following environment variables in your .env file:

RATE_LIMIT_ENABLED=true
RATE_LIMIT_MAX_REQUESTS=60    # Maximum requests allowed per window (default: 60)
RATE_LIMIT_WINDOW_MINUTES=1   # Window size in minutes

If RATE_LIMIT_ENABLED is set to true, the server will apply rate limiting middleware. Adjust RATE_LIMIT_MAX_REQUESTS and RATE_LIMIT_WINDOW_MINUTES as needed for your environment.

Sentry Error Tracking & Monitoring (Optional)

The server optionally supports Sentry for error tracking, performance monitoring, and debugging. Sentry integration is completely optional and only initialized if configured.

Installation

To enable Sentry monitoring, install the optional dependency:

# Using UV (recommended)
uv sync --extra sentry

Configuration

Enable Sentry by setting the SENTRY_DSN environment variable in your .env file:

# Required: Sentry DSN for your project
SENTRY_DSN=https://your-key@o12345.ingest.us.sentry.io/6789

# Optional: Performance monitoring sample rate (0.0-1.0, default: 1.0)
SENTRY_TRACES_SAMPLE_RATE=1.0

# Optional: Include personally identifiable information (default: false).
# When true, tool inputs and outputs (NetBox inventory data) are sent to Sentry.
SENTRY_SEND_DEFAULT_PII=false

# Optional: Environment name (e.g., "production", "staging")
SENTRY_ENVIRONMENT=production

# Optional: Release version (auto-detected from package if not set)
SENTRY_RELEASE=1.2.3

# Optional: Profiling - continuous profiling sample rate (0.0-1.0, default: 1.0)
SENTRY_PROFILE_SESSION_SAMPLE_RATE=1.0

# Optional: Profiling - lifecycle mode for profiling (default: "trace")
# Options: "all", "continuation", "trace"
SENTRY_PROFILE_LIFECYCLE=trace

# Optional: Enable log capture as breadcrumbs and events (default: true)
SENTRY_ENABLE_LOGS=true

Features

When enabled, Sentry automatically captures:

  • Exceptions & Errors: All unhandled exceptions with full context

  • Performance Metrics: Request/response times and traces

  • MCP Integration: Detailed MCP server activity and interactions

  • Logs & Breadcrumbs: Application logs and event trails for debugging

  • Context Data: Environment, client info, and request parameters

Getting a Sentry DSN

  1. Create a free account at sentry.io

  2. Create a new Python project

  3. Copy your DSN from the project settings

  4. Set it in your .env file

Disabling Sentry

Sentry is completely optional. If you don't set SENTRY_DSN, the server will run normally without any Sentry integration, and no monitoring data will be collected.

SSL/TLS Configuration

The server supports SSL certificate verification and custom timeout settings:

NETBOX_VERIFY_SSL=true    # Enable SSL certificate verification
NETBOX_TIMEOUT=30         # Total time per request, retries included (seconds)

Certificates are verified against the operating system trust store, so a NetBox behind an internal CA works as soon as that CA is trusted by the OS. SSL_CERT_FILE or SSL_CERT_DIR take precedence when set.

Transport Configuration

The server supports multiple transport mechanisms for the MCP protocol:

STDIO Transport (Default)

The default transport uses standard input/output for communication. This is ideal for local usage and integration with tools that communicate via stdin/stdout:

MCP_TRANSPORT=stdio

HTTP SSE Transport (Server-Sent Events)

For network-based deployments, you can use HTTP with Server-Sent Events. This allows the MCP server to be accessed over HTTP with real-time streaming:

MCP_TRANSPORT=sse
MCP_HTTP_HOST=127.0.0.1        # Localhost
MCP_HTTP_PORT=8000           # Port to listen on
MCP_HTTP_BEARER_TOKEN=your-secret-token  # Optional authentication token

When using SSE transport with a bearer token, clients must include the token in their requests:

curl -H "Authorization: Bearer your-secret-token" http://localhost:8000/sse

HTTP Streamable Transport

The HTTP Streamable transport provides HTTP-based communication with request/response streaming. This is ideal for web integrations and tools that need HTTP endpoints:

MCP_TRANSPORT=http
MCP_HTTP_HOST=127.0.0.1        # Localhost
MCP_HTTP_PORT=8000           # Port to listen on
MCP_HTTP_BEARER_TOKEN=your-secret-token  # Optional authentication token

When using streamable transport with a bearer token:

curl -H "Authorization: Bearer your-secret-token" \
     -H "Accept: application/json, text/event-stream" \
     -H "Content-Type: application/json" \
     -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' \
     http://localhost:8000/mcp

Per-user NetBox tokens

By default every client shares the server's NETBOX_TOKEN, so NetBox sees one user. With NETBOX_TOKEN_PASSTHROUGH=true, each client sends its own NetBox API token instead. NetBox applies that user's permissions and the changelog records the real user:

MCP_TRANSPORT=http
MCP_HTTP_HOST=0.0.0.0
NETBOX_TOKEN_PASSTHROUGH=true
claude mcp add --transport http netbox https://netbox-mcp.example.com/mcp \
  --header "Authorization: Bearer nbt_your-key.your-token"
  • Requests without a token, or with a token NetBox rejects, get HTTP 401. If NetBox cannot be reached to check a token within 10 seconds (or NETBOX_TIMEOUT, if lower), the request gets HTTP 503 with Retry-After, so clients retry instead of logging in again. The 503 passes on NetBox's own Retry-After when NetBox sends one. Accepted tokens are cached for 60 seconds. After that, the token is still accepted right away for up to 10 minutes while the server re-checks it with NetBox in the background, so a known user never waits on a check, even during a NetBox outage. A revoked token is dropped once its re-check comes back; until then it only reaches tools that don't call NetBox (such as the tool list), because NetBox refuses the token on every call that does. Rejected tokens are cached for 30 seconds, so a token just created in NetBox may be refused for up to 30 seconds if it was tried before it existed. At most 8 token checks reach NetBox at once; requests with a token the server hasn't seen yet wait for a free slot, and get HTTP 503 if the wait exceeds the check timeout.

  • v2 (nbt_...) and legacy v1 tokens both work; the server sends each to NetBox with the right scheme.

  • NETBOX_TOKEN is ignored. Only the http and sse transports are supported, and the server refuses to start if MCP_HTTP_BEARER_TOKEN is set too, since both use the Authorization header.

  • With RATE_LIMIT_ENABLED=true, each NetBox user gets their own rate-limit window (each token on NetBox before 4.5), so the limit no longer caps the server's total load on NetBox.

  • With NETBOX_PLUGIN_DISCOVERY=true, plugin types found with any user's token are added to one shared list. rediscover replaces that list with what the calling user can see, which drops uninstalled plugins; another user's call that names a type only they can see rediscovers it with their token.

  • Clients send their NetBox tokens to this server, so put it behind HTTPS.

Note: The HTTP transport requires proper JSON-RPC formatting with jsonrpc and id fields. The server may also require session initialization for some operations.

Health Endpoint

Both HTTP transports (sse and http) serve GET /health, which answers 200 ok when the server is handling requests. It needs no bearer token and does not contact NetBox, so a NetBox outage does not mark the MCP server unhealthy. The Docker image's HEALTHCHECK uses it:

curl http://localhost:8000/health

For more information on FastMCP transports, see the FastMCP documentation.

Contributing

  1. Fork the repository

  2. Create a feature branch (git checkout -b feature/amazing-feature)

  3. Make your changes

  4. Run tests and ensure code quality (uv run pytest && uv run ruff check .)

  5. Commit your changes (git commit -m 'Add amazing feature')

  6. Push to the branch (git push origin feature/amazing-feature)

  7. Open a Pull Request

License

MIT License - see LICENSE file for details.

Available Tools

18 tools
netbox_allocate_availableNetbox Allocate AvailableA

Allocate the next free IP, prefix, VLAN or ASN from a pool and create it. NetBox picks the value atomically, so concurrent callers never get the same one.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataNoAttributes of the new object(s). Prefixes need {'prefix_length': 24}; VLANs need {'name': 'users'}. A list allocates several at once, e.g. [{'description': 'a'}, {'description': 'b'}] for two IPs.
kindYesWhat to look for: 'ips' (prefix or IP range), 'prefixes' (prefix), 'vlans' (VLAN group), 'asns' (ASN range).
parent_idYesNumeric object ID.
parent_typeYesType of the parent object that holds the pool.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish write semantics (readOnlyHint=false, non-idempotent, non-destructive), so the bar is lower. The description adds genuinely useful context beyond them: the value is chosen atomically and concurrent callers never collide. It still omits permission/auth requirements and what gets created on failure, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the action and followed by the atomicity guarantee. No filler or redundant restatement; every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and annotations covering the write/safety profile, the description is adequate on behavior. Its gap is routing: among 18 siblings it never tells the agent when this is the right choice versus get_available or create_object, which matters for correct selection.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 all four parameters including enum meanings and the data payload examples. The tool description adds no parameter detail beyond what the schema provides, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource set ('Allocate the next free IP, prefix, VLAN or ASN from a pool and create it'), which is more than a restatement. However, it does not name or explicitly distinguish itself from siblings like netbox_get_available or netbox_create_object, so differentiation is left to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the use case (allocate a fresh value from an existing pool) but never states when to prefer this over netbox_get_available or netbox_create_object, nor any exclusions. Usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

netbox_bulk_create_objectsNetbox Bulk Create ObjectsA

Create many objects of one type in a single transaction (all or nothing). Returns the IDs of the created objects.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesObjects to write.
object_typeYesNetBox object type as 'app.model' (e.g. 'dcim.device', 'ipam.ipaddress', 'virtualization.virtualmachine') or as an API path ('dcim/devices'). netbox_list_object_types lists every type.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so the safety profile is covered. The description adds genuinely new behavior beyond them: atomic all-or-nothing execution, which is material for a non-idempotent write. It does not disclose permission requirements or any batch-size or rate constraints (the 500-item cap lives only in the schema).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler. The atomicity guarantee and return value are front-loaded and each sentence carries distinct information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With annotations, a fully described schema, and an output schema covering return values, the description supplies the one thing structured fields cannot: the all-or-nothing transaction semantics. Only the absence of permission or batch-limit context keeps it from being fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: object_type documents the 'app.model' vs API-path forms and points at netbox_list_object_types, and data documents its role. The description adds no parameter-level detail beyond that, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create many objects of one type') and adds transactional scope ('single transaction, all or nothing'). The word 'many' implicitly separates it from netbox_create_object, but no sibling is named explicitly, so differentiation is left to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The bulk/multi-object framing implies when this tool is appropriate versus a single-object create, but the description never states a when-to-use condition, a when-not-to-use condition, or names an alternative such as netbox_create_object or netbox_bulk_update_objects. Usage is implied rather than prescribed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

netbox_bulk_delete_objectsNetbox Bulk Delete ObjectsA
Destructive

Permanently delete many objects of one type in a single transaction. Confirm with the user first.

ParametersJSON Schema
NameRequiredDescriptionDefault
object_idsYesIDs of the objects to delete.
object_typeYesNetBox object type as 'app.model' (e.g. 'dcim.device', 'ipam.ipaddress', 'virtualization.virtualmachine') or as an API path ('dcim/devices'). netbox_list_object_types lists every type.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already disclose destructiveHint=true, openWorldHint=true, and idempotentHint=false, so the safety profile is covered. The description adds crucial value: it specifies 'Permanently' (irreversible) and 'in a single transaction' (atomicity), which goes beyond the annotations. The 'Confirm with the user first' instruction is an important behavioral directive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short imperative sentences, front-loaded with the core action and a critical safety instruction. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the destructive nature, output schema presence, and full parameter coverage, the description covers the essentials: permanence, atomicity, and user confirmation. It could mention rate limits or partial failure behavior, but those are minor for a delete tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so parameters are fully documented in the schema. The description adds no additional parameter details, but the baseline for high coverage is 3. It earns a 4 because the 'single transaction' phrasing clarifies the atomic expectation for the object_ids batch, slightly augmenting parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (delete), resource (objects), scope (many objects of one type), and execution model (single transaction). It cleanly distinguishes itself from netbox_delete_object (singular) and netbox_bulk_update_objects.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear operational precondition ('Confirm with the user first'), which is valuable context for a destructive operation. However, it doesn't explicitly name alternatives like netbox_delete_object for single deletions, leaving the choice between bulk and single deletion to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

netbox_bulk_update_objectsNetbox Bulk Update ObjectsB
Idempotent

Update many objects of one type in a single transaction (all or nothing).

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesPartial updates, each with the object 'id', e.g. [{'id': 1, 'status': 'active'}, {'id': 2, 'status': 'active'}].
object_typeYesNetBox object type as 'app.model' (e.g. 'dcim.device', 'ipam.ipaddress', 'virtualization.virtualmachine') or as an API path ('dcim/devices'). netbox_list_object_types lists every type.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare idempotentHint=true, destructiveHint=false, readOnlyHint=false, openWorldHint=true, already covering the safety and idempotency profile. The description adds useful atomicity context ('single transaction, all or nothing'), which is the key behavioral trait beyond annotations. However, it doesn't say what happens on partial failure (rollback?), nor does it mention the 500-item cap or auth requirements. Adds some value, but leaves key transaction semantics unexplained.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single well-formed sentence that front-loads the operation and parenthetically states the transactional guarantee. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained. Annotations cover safety profile. But for a bulk mutation with atomicity claims, the description is thin: it doesn't state the 500-item maximum, whether a single bad entry aborts the whole batch, or whether partial-merge updates are supported (though the schema hints at this). Adequate but with clear gaps for a bulk-write tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the schema descriptions are rich: they explain the 'app.model' or API path format for object_type, and give a concrete example of partial update objects with 'id' for data. The description adds no parameter detail beyond what the schema provides, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource+scope: 'Update many objects of one type in a single transaction'. This clearly distinguishes it from netbox_update_object (singular) and netbox_bulk_delete_objects (different verb). It doesn't explicitly name the sibling it differs from, but the singular/plural distinction is implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance. The description doesn't say when to choose bulk update over individual updates, or when not to use it. The 'single transaction (all or nothing)' clause hints at atomicity but doesn't guide tool selection. An agent must infer the routing from the tool name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

netbox_create_objectNetbox Create ObjectA

Create one NetBox object. Returns the created object.

Look up related objects first (netbox_get_objects) and pass their IDs.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesField values. Foreign keys take numeric IDs, e.g. {'name': 'sw01', 'device_type': 4, 'role': 2, 'site': 1, 'status': 'active'}. Tags: [{'name': 'core'}] or [3]. Use netbox_describe_object_type for the fields and choices.
object_typeYesNetBox object type as 'app.model' (e.g. 'dcim.device', 'ipam.ipaddress', 'virtualization.virtualmachine') or as an API path ('dcim/devices'). netbox_list_object_types lists every type.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare non-read-only, non-idempotent, non-destructive, open-world behavior, so safety profile is covered. The description adds a useful behavioral workflow constraint (resolve foreign keys before creating) plus return confirmation, but says nothing about auth requirements, validation failures, or error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, zero filler, purpose front-loaded before the workflow hint. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the description's prerequisite hint covers the main practical pitfall for this nested-object call. Minor gaps around error/validation behavior remain but are not essential for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already fully documented in the schema, including FK-as-ID and tag formats. The description only restates the FK-ID convention, adding no semantics beyond the schema — baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create one NetBox object') and adds that it returns the created object. The word 'one' implicitly contrasts with netbox_bulk_create_objects, but no sibling is named explicitly, so differentiation is left partly to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit prerequisite workflow: look up related objects first with netbox_get_objects and pass their IDs. That routes the agent to the right sibling for the lookup step. No explicit when-not guidance (e.g. use bulk_create for multiple objects) is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

netbox_delete_objectNetbox Delete ObjectA
Destructive

Permanently delete one NetBox object. Dependent objects may be deleted with it (e.g. a device's interfaces). Confirm with the user first.

ParametersJSON Schema
NameRequiredDescriptionDefault
object_idYesNumeric object ID.
object_typeYesNetBox object type as 'app.model' (e.g. 'dcim.device', 'ipam.ipaddress', 'virtualization.virtualmachine') or as an API path ('dcim/devices'). netbox_list_object_types lists every type.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and non-idempotency, but the description adds genuinely new behavioral context: deletion is permanent and cascades to dependent objects (interfaces of a device). That cascade disclosure is the kind of consequence an agent cannot infer from the annotations alone. It stops short of describing failure modes when dependents block deletion.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the destructive action and its scope, followed by the cascade warning and the confirmation requirement. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained. Combined with 100% schema coverage and rich annotations, the description supplies the remaining critical context (permanence, cascade, user confirmation). Only the behavior on delete failure or dependency constraints is unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (object_id, object_type) are already fully documented in the schema, including the 'app.model' format and a pointer to netbox_list_object_types. The description adds no parameter-level detail, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Permanently delete') and resource ('one NetBox object'), and the singular scope ('one') implicitly distinguishes it from the sibling netbox_bulk_delete_objects. An agent can route between the single and bulk delete tools without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives one operational instruction ('Confirm with the user first'), which is useful but is about process, not tool selection. It never states when to prefer this over netbox_bulk_delete_objects or what preconditions (e.g. dependency checks) must hold, so usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

netbox_describe_object_typeNetbox Describe Object TypeA
Read-onlyIdempotent

Describe the writable fields of an object type: type, required, choices.

Call this before creating or updating an object to build a valid payload. Foreign keys take the related object's numeric ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
object_typeYesNetBox object type as 'app.model' (e.g. 'dcim.device', 'ipam.ipaddress', 'virtualization.virtualmachine') or as an API path ('dcim/devices'). netbox_list_object_types lists every type.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint/idempotentHint, so safety is covered and the bar is lower. The description still adds real value beyond that: it discloses the shape of the returned field metadata (type, required, choices) and the crucial FK convention that foreign keys take the related object's numeric ID.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, each earning its place: what it returns, when to call it, and one critical payload convention. The purpose is front-loaded and no sentence is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value detail is correctly left to structured metadata, and the description still summarizes it briefly. Annotations cover the safety profile and the schema covers the parameter, making the description complete for a read-only introspection tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single 'object_type' parameter is fully documented in the schema with format and examples, so the description need not carry that load. It adds only the FK-ID note, which concerns the consumer of the result rather than the input parameter itself.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('Describe the writable fields of an object type') and scopes it precisely to writable fields, returning 'type, required, choices'. That scope distinguishes it from discovery siblings like netbox_list_object_types, which enumerate types rather than describe one type's fields.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states a clear trigger: 'Call this before creating or updating an object to build a valid payload,' tying it directly to the create/update siblings. There is no explicit when-not condition or named alternative, but the intended call site is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

netbox_get_availableNetbox Get AvailableA
Read-onlyIdempotent

List free IPs, child prefixes, VLAN IDs or ASNs in a pool.

Examples: free IPs in prefix 12 -> ('ipam.prefix', 12, 'ips'); free /24s in a prefix -> ('ipam.prefix', 12, 'prefixes'); free VLAN IDs in group 3 -> ('ipam.vlangroup', 3, 'vlans').

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYesWhat to look for: 'ips' (prefix or IP range), 'prefixes' (prefix), 'vlans' (VLAN group), 'asns' (ASN range).
limitNoMaximum results.
parent_idYesNumeric object ID.
parent_typeYesType of the parent object that holds the pool.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds valid parent/kind combinations, which is useful, but says nothing about what 'free' means, how results are computed, or pagination behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence, followed by three compact, illustrative examples. No filler; the examples earn their place by clarifying invocation. Slightly verbose in example repetition but well organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With read-only annotations covering safety and an output schema covering return values, the description only needs to convey purpose and invocation, which it does. The remaining gap is sibling differentiation versus netbox_allocate_available.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline would be 3. The description earns above baseline by mapping valid parent_type/kind pairings (e.g., 'ips'/'prefixes' with ipam.prefix, 'vlans' with ipam.vlangroup), which the flat schema does not encode as constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (list) and resource (free IPs, child prefixes, VLAN IDs, ASNs in a pool), which is clearly distinct from generic readers like netbox_get_objects. However, it never names or contrasts the closely related sibling netbox_allocate_available, so the agent must infer the boundary between listing and allocating.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The examples imply usage (free IPs in a prefix, free /24s in a prefix, free VLAN IDs in a group), giving the agent a sense of when this applies. But there is no explicit when-to-use / when-not guidance and no direction toward netbox_allocate_available for the consuming operation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

netbox_get_changelogsNetbox Get ChangelogsA
Read-onlyIdempotent

List change log entries (who changed what and when), newest first.

Each entry has action (create/update/delete), user_name, time, changed_object_type/id and object_repr. Entries of one request share a request_id. Set include_data to see what exactly changed.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size (1-1000).
offsetNoNumber of results to skip.
filtersNoChange log filters, e.g. {'changed_object_type': 'dcim.device', 'changed_object_id': 5}, {'user': 'admin'}, {'action': 'delete'}, {'time_after': '2026-01-01T00:00:00Z'}, {'request_id': '<uuid>'}.
include_dataNoInclude prechange_data/postchange_data - the full object before and after the change (several KB per entry). Use it with a narrow filter, e.g. one changed_object_id.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, non-destructive, so the safety profile is covered. The description adds real value beyond that: result ordering, the per-entry field set, request_id grouping semantics, and a cost warning that include_data returns several KB per entry and should be paired with a narrow filter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the core purpose and ordering, then entry structure, then the one behavioral caveat. No filler; every sentence carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description needn't detail return values, and it still helpfully summarizes entry shape. It is complete enough to call correctly, though it says nothing about pagination behavior or how filters combine, which a multi-filter list tool could benefit from.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all four parameters are already documented in the schema, including examples for filters and the size caveat for include_data. The description restates include_data's purpose ('see what exactly changed') without adding syntax or semantics beyond the schema, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('List change log entries') with the key differentiating content ('who changed what and when') and ordering ('newest first'). It is clearly distinguishable from sibling tools like netbox_get_objects or netbox_search_objects.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied (audit/history lookup), and the description hints at narrowing filters for include_data, but it never states when to use this tool versus alternatives such as netbox_get_object or the list tools. No exclusions or prerequisites are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

netbox_get_objectNetbox Get ObjectC
Read-onlyIdempotent

Get one NetBox object by type and ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
omitNoDrop these fields from the response, e.g. ['config_context', 'custom_fields']. NetBox 4.5.2+. Ignored when 'fields' is set.
briefNoReturn the minimal representation (id, url, display, name).
fieldsNoOnly return these fields, e.g. ['id', 'name', 'status']. ALWAYS pass this for listings - full objects cost 10x more tokens.
object_idYesNumeric object ID.
object_typeYesNetBox object type as 'app.model' (e.g. 'dcim.device', 'ipam.ipaddress', 'virtualization.virtualmachine') or as an API path ('dcim/devices'). netbox_list_object_types lists every type.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is fully covered. The description adds nothing beyond that: no note on error behavior for missing IDs, response size characteristics, or how 'brief'/'fields' interact with payload cost.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero filler — the essential identity of the tool leads the description. It is efficient, though so sparse that it reads as under-specified rather than deliberately trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, and the input schema is fully documented, meaning the core call path is covered. What is missing is context an agent needs for correct selection — the relationship to netbox_search_objects/netbox_get_objects and when a single fetch is the wrong tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema itself is unusually rich (it documents omit, brief, fields with examples, token-cost warnings, and the app.model vs API-path formats for object_type). The description adds no meaning beyond that, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Get'), resource ('NetBox object'), and scope ('one ... by type and ID'), which implicitly separates it from the plural netbox_get_objects and netbox_search_objects. It never names an alternative explicitly, so it stops short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use statement, no exclusions, and no routing to alternatives such as netbox_search_objects (when the ID is unknown) or netbox_get_objects (for multiple records). 'By type and ID' is a precondition already enforced by the required schema fields, not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

netbox_get_objectsNetbox Get ObjectsA
Read-onlyIdempotent

List NetBox objects of one type, with filtering and pagination.

Returns 'results' plus 'total' (all matches) and 'has_more'/'next_offset'. Results are paginated - check 'has_more' before concluding. To count objects cheaply use fields=['id'] and limit=1 and read 'total'.

Examples: netbox_get_objects('dcim.device', {'site_id': 3, 'status': 'active'}, fields=['id', 'name', 'primary_ip4']) netbox_get_objects('ipam.ipaddress', {'parent': '10.0.0.0/24'}, fields=['address', 'dns_name'])

ParametersJSON Schema
NameRequiredDescriptionDefault
omitNoDrop these fields from the response, e.g. ['config_context', 'custom_fields']. NetBox 4.5.2+. Ignored when 'fields' is set.
briefNoReturn the minimal representation (id, url, display, name).
limitNoPage size (1-1000).
fieldsNoOnly return these fields, e.g. ['id', 'name', 'status']. ALWAYS pass this for listings - full objects cost 10x more tokens.
offsetNoNumber of results to skip.
filtersNoNetBox filters, e.g. {'site_id': 1, 'status': 'active', 'name__ic': 'core'}. Pass a list for OR: {'id': [1, 2]}. null matches empty: {'tenant_id': None}. Lookup suffixes: n, ic, nic, isw, nisw, iew, niew, ie, nie, empty, regex, iregex, lt, lte, gt, gte. NOT supported: '__in' and multi-hop lookups like 'device__site_id' - query the related object first, then filter by its ID.
orderingNoSort field(s); prefix with '-' for descending, e.g. 'name' or ['site', '-name'].
object_typeYesNetBox object type as 'app.model' (e.g. 'dcim.device', 'ipam.ipaddress', 'virtualization.virtualmachine') or as an API path ('dcim/devices'). netbox_list_object_types lists every type.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), and the description adds genuinely useful behavior beyond them: the response envelope keys ('results', 'total', 'has_more', 'next_offset') and the instruction to check 'has_more' before concluding. It stops short of stating rate limits or default page size (though schema covers limit).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and return-shape facts, then compact examples; every line earns its place. The example block is slightly verbose but directly demonstrates parameter usage, so it is defensible rather than wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return-value detail is not required, yet the description still explains the pagination envelope, which is the main thing an agent needs to avoid premature conclusions. For an 8-parameter, 100%-covered listing tool this is close to complete; only sibling routing is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema does not: the field-selection cost hint for counting (fields=['id'], limit=1, read 'total') and examples showing how filters and fields are passed together. That is real value beyond the structured field docs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource+scope ('List NetBox objects of one type, with filtering and pagination'), which is clearly distinct from single-object get_object and from write tools. It does not explicitly name or rule out sibling alternatives such as netbox_search_objects, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete usage patterns (paginate via 'has_more', count cheaply with fields=['id'] and limit=1) and two worked examples, which is more than implied usage. However, with a sibling netbox_search_objects present, the description never says when to prefer this tool over search, nor when not to use it, so routing guidance is incomplete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

netbox_get_statusNetbox Get StatusA
Read-onlyIdempotent

Get NetBox version, installed plugins and apps, worker status and the authenticated user. Also reports this server's read-only/dry-run modes.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint, so the safety profile is covered. The description adds genuine behavioral context beyond that: it discloses that the server's read-only/dry-run modes are reported and implies an authenticated-user requirement via "the authenticated user."

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two lean sentences, front-loaded with the primary content (what status data is retrieved). Every clause carries meaning with no filler, and the secondary note about read-only/dry-run modes is placed last appropriately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return-value detail need not be repeated, and the description still previews the key fields returned. For a zero-parameter, read-only status tool whose annotations cover the safety profile, nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so per the rubric the baseline is 4. There are no parameters for the description to clarify, and the schema is trivially complete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ("Get") plus the resource (NetBox status) and enumerates exactly what is returned: version, installed plugins/apps, worker status, authenticated user, and server modes. This is clearly distinct from the object CRUD/query siblings, though it never explicitly names an alternative tool to reinforce the distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use or when-not-to-use guidance; the usage (a status/health check) is only implied by the enumerated return fields. No alternatives or prerequisites are mentioned, so an agent must infer the appropriate invocation context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

netbox_graphql_queryNetbox Graphql QueryA
Read-onlyIdempotent

Run a read-only GraphQL query against NetBox's /graphql/ endpoint.

Use it to fetch nested data that would otherwise need many REST calls. Mutations and subscriptions are rejected. Always paginate large lists, e.g. device_list(pagination: {limit: 50}).

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesGraphQL query. Fetch related data in one round trip, e.g. '{ device_list(filters: {site: {name: {exact: "DC1"}}}) { id name interfaces { name ip_addresses { address } } } }'. NetBox 4.5+ requires lookups on filters ({exact: ...}).
variablesNoGraphQL variables.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and non-destructive behavior, so the safety profile is covered; the description adds real value beyond that by naming the endpoint, disclosing that mutations/subscriptions are rejected, and stating a pagination requirement. It does not mention auth requirements or result-size limits, which keeps it below a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with what the tool is, then when to use it, then hard constraints, then a practical tip. Nothing is wasted, though the pagination example partially overlaps the schema's own query example.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no explanation, and annotations cover the safety profile. The description supplies endpoint, rejection semantics and pagination guidance, leaving only auth/permission and rate-limit behavior unstated for a fully complete picture.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, and the description earns above it by adding a concrete pagination usage pattern (device_list(pagination: {limit: 50})) that shows how to shape the query argument. It does not discuss the variables parameter at all, leaving one of the two params to the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (run), a specific artifact (read-only GraphQL query) and the exact endpoint (/graphql/), which cleanly separates it from the REST-oriented siblings like netbox_get_objects and netbox_list_object_types. An agent knows immediately this is the GraphQL escape hatch rather than a generic object fetcher.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Use it to fetch nested data that would otherwise need many REST calls" gives a clear positive selection criterion, and "Mutations and subscriptions are rejected" bounds what it can do. It stops short of naming the sibling to prefer when nested traversal is not needed, so no explicit alternative is offered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

netbox_list_object_typesNetbox List Object TypesA
Read-onlyIdempotent

List the NetBox object types these tools accept, with their API endpoints.

Types are named 'app.model' (e.g. 'dcim.device'). Plugin types appear when the server runs with plugin discovery enabled.

ParametersJSON Schema
NameRequiredDescriptionDefault
appNoOnly types of this app, e.g. 'dcim', 'ipam', 'netbox_dns'.
rediscoverNoRe-read plugin types from NetBox (plugin discovery must be enabled on the server).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so safety and idempotency are covered. The description adds that plugin types appear only with plugin discovery enabled, and that rediscovery is possible, which is useful context. However, it does not explain the return format (though output schema exists) or any caching behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero waste. The primary purpose is front-loaded, and the naming/plugin caveat is appropriately placed second.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema and full parameter descriptions, the description is nearly complete. It explains the type format and plugin discovery caveat. A minor gap is the lack of explicit guidance on when to prefer this over netbox_describe_object_type or netbox_get_objects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (app, rediscover) are fully documented in the schema. The description adds the naming convention ('app.model') but does not add syntax or format details beyond what the schema already provides for the parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (List) and resource (NetBox object types with API endpoints), which is distinct from siblings like netbox_get_objects or netbox_describe_object_type. The agent can immediately tell this is a discovery/schema tool, not a data retrieval or mutation tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage (discover which object types exist) but does not explicitly say when to use this versus netbox_describe_object_type or netbox_get_objects. No alternatives are named, leaving the agent to infer context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

netbox_render_configNetbox Render ConfigA
Read-onlyIdempotent

Render the configuration of a device or VM from its assigned config template (NetBox config templates + config context). Changes nothing, but NetBox only allows it for API tokens with write enabled.

ParametersJSON Schema
NameRequiredDescriptionDefault
object_idYesNumeric object ID.
object_typeYesDevice or virtual machine.
extra_contextNoExtra variables merged into the template context.
config_template_idNoRender this config template instead of the one assigned to the object.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false), so the bar is lower, and the description still adds a non-obvious behavioral fact the annotations cannot express: the write-token requirement despite a side-effect-free operation. It does not mention rate limits or output shape, but an output schema exists and covers the latter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short clauses, front-loaded with the action and followed immediately by the constraint. Every clause carries information; nothing is redundant with the title or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only render tool with full schema coverage, an output schema, and annotations declaring the safety profile, the description supplies the one missing piece an agent needs (the write-token prerequisite) without over-explaining return values that the output schema already defines.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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's mention of 'assigned config template' and 'config context' loosely corresponds to the config_template_id override and extra_context parameters, but it adds no syntax, format, or merge-precedence detail beyond what the schema already documents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a precise verb+resource: rendering a device/VM configuration from its assigned config template, with the parenthetical naming the two NetBox subsystems involved (config templates + config context). This is clearly distinguishable from the CRUD/query siblings (netbox_get_object, netbox_create_object, etc.), which all operate on objects rather than rendering derived config.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a genuine operational precondition that determines whether the call will succeed: NetBox requires an API token with write enabled even though nothing is modified. No alternative tool exists for this capability among the siblings, so the absence of explicit 'when-not' routing is acceptable. It stops short of stating when a caller would want to render config versus reading config context directly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

netbox_search_objectsNetbox Search ObjectsA
Read-onlyIdempotent

Search several NetBox object types at once with NetBox's 'q' filter.

Returns results keyed by object type. A '_meta' key appears when some types failed ('errors' - treat as unknown, NOT as "no match") or had more matches than 'limit' ('truncated' - the full count per type).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum results per type.
queryYesFree text: a name, IP, serial, asset tag, description...
fieldsNoOnly return these fields, e.g. ['id', 'name', 'status']. ALWAYS pass this for listings - full objects cost 10x more tokens.
object_typesNoTypes to search. Default: dcim.device, dcim.site, ipam.ipaddress, ipam.prefix, dcim.interface, dcim.rack, ipam.vlan, circuits.circuit, virtualization.virtualmachine

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/openWorld/non-destructive, so safety is covered. The description adds real value beyond that: results are keyed by object type, and the '_meta' key semantics distinguish 'errors' (treat as unknown, not as no-match) from 'truncated' (full count per type) — an important disclosure about partial-failure behavior that the annotations do not carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences with the core action front-loaded and the failure-mode semantics following immediately. Every sentence earns its place; nothing is padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return shape needn't be re-explained, yet the description still clarifies the keyed-by-type result and _meta semantics. The remaining gap is selection guidance against the many sibling read tools, which an agent must infer.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 query, limit, fields, and object_types (including the default type list and the token-cost warning for 'fields'). The description adds no parameter-level detail, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Search several NetBox object types at once with NetBox's q filter'), which is clear and concrete. It does not, however, explicitly differentiate itself from siblings like netbox_get_objects or netbox_graphql_query, leaving the agent to infer that this is the free-text, multi-type search variant.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: the agent can infer this is the tool for free-text cross-type lookups, but there is no explicit when-to-use guidance and no named alternative (e.g. netbox_get_objects for filtered queries or netbox_graphql_query for complex queries). The _meta guidance is about interpreting results, not about selecting this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

netbox_trace_cableNetbox Trace CableA
Read-onlyIdempotent

Trace cable paths from a port through patch panels and circuits.

For an interface, console, power port/outlet or power feed: the path from it to the far end, one hop (near end, cable, far end) per segment. For a pass-through port (front/rear port, circuit termination): every cable path running through it, each as its list of nodes.

ParametersJSON Schema
NameRequiredDescriptionDefault
object_idYesNumeric object ID.
object_typeYesType of the starting port.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds valuable behavioral context: it explains the hop-by-hop segment structure (near end, cable, far end) and that pass-through ports return multiple paths as node lists, which is 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core purpose, then split into the two behavioral modes. Every clause adds information about what the tool returns or how it behaves.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description doesn't need to detail return values, and it correctly focuses on explaining the path semantics and the two modes of operation. Combined with rich annotations and complete parameter docs, the description provides everything needed to invoke and interpret the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%. The description explains what the object_type/object_id pair represents (a starting port) and lists the valid port types, but the enum already documents all 10 options. The baseline of 3 applies since the schema fully describes the parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (trace) and resource (cable paths), and explains the domain: from a port through patch panels and circuits. Clearly distinguishes itself from siblings like netbox_get_object and netbox_graphql_query which don't perform path tracing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the two operational modes: tracing from an interface/console/power port to its far end, and tracing all paths through a pass-through port. This implicitly tells the agent when the tool is appropriate, though it doesn't name alternative tools like netbox_get_objects for non-path queries.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

netbox_update_objectNetbox Update ObjectA
Idempotent

Update fields of one NetBox object (partial update). Returns the updated object.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesOnly the fields to change (PATCH), e.g. {'status': 'offline', 'description': 'RMA'}.
object_idYesNumeric object ID.
object_typeYesNetBox object type as 'app.model' (e.g. 'dcim.device', 'ipam.ipaddress', 'virtualization.virtualmachine') or as an API path ('dcim/devices'). netbox_list_object_types lists every type.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety and idempotency profile is covered. The description adds the PATCH-style partial-update semantics and notes it returns the updated object, which is incremental value, but it says nothing about permissions, error behavior, or what happens to unspecified fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the operation and its scope, with zero filler. The second sentence restates the return value, which is mildly redundant given an output schema exists, but it costs almost nothing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-parameter mutation tool with 100% schema coverage, full annotations, and a dedicated output schema, the description provides enough to call the tool correctly. The remaining gap is the absence of any usage/routing guidance relative to the bulk and create siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters (object_type, object_id, data) are already documented in the schema, including the 'app.model' format and the PATCH example. The description adds no parameter-level detail beyond that, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Update fields of one NetBox object') and adds the scope qualifier '(partial update)', which implicitly distinguishes it from netbox_bulk_update_objects and netbox_create_object. It is clear, but does not explicitly name the sibling tools it is contrasted with, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The '(partial update)' qualifier implies this is for modifying a subset of fields on an existing object, which is useful implied usage. However, there is no explicit when-to-use statement, no mention of prerequisites, and no routing to alternatives such as netbox_bulk_update_objects for multi-object changes or netbox_create_object for new records.

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.

  1. 18 tool updatesv0.1.0
    • First observednetbox_allocate_available
    • First observednetbox_bulk_create_objects
    • First observednetbox_bulk_delete_objects
    • First observednetbox_bulk_update_objects
    • First observednetbox_create_object
    • First observednetbox_delete_object
    • First observednetbox_describe_object_type
    • First observednetbox_get_available
    • First observednetbox_get_changelogs
    • First observednetbox_get_object
    • First observednetbox_get_objects
    • First observednetbox_get_status
    • First observednetbox_graphql_query
    • First observednetbox_list_object_types
    • First observednetbox_render_config
    • First observednetbox_search_objects
    • First observednetbox_trace_cable
    • First observednetbox_update_object

TDQS

A3.8/5.0

Scored across 18 tools

Disambiguation4/5

Each tool has a fairly distinct purpose, and descriptions clarify boundaries well (e.g. netbox_get_objects filters one type while netbox_search_objects queries multiple types with the 'q' filter). Minor overlap exists between the several read paths (get_objects, search_objects, graphql_query) and between get_available vs allocate_available, but the docs disambiguate them adequately.

Naming Consistency5/5

Every tool uses the same netbox_ prefix followed by a consistent verb_noun pattern (netbox_get_object(s), netbox_create_object, netbox_bulk_update_objects, netbox_delete_object). No mixing of conventions.

Tool Count4/5

18 tools is on the heavier side but earns its place given NetBox's breadth: single + bulk CRUD, discovery, search, GraphQL, cable tracing, config rendering, and IPAM allocation. The set is well-scoped with little redundancy.

Completeness5/5

Full lifecycle coverage is present: read (get/list/search/graphql), create/update/delete singles, bulk variants of each, plus discovery (list/describe types, status), changelogs, pool inspection/allocation, cable tracing and config rendering. No obvious dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

  • Let AI agents query data and act across all your business apps via MCP.

  • Protocol-native energy infrastructure orchestration for AI data centers. Provides 46 MCP tools across 8 grid protocols (IEC-61850, DNP3, Modbus, OCPP, OpenADR, IEEE 2030.5, IEC 60870-5-104, ICCP) with 5 core API primitives: connect, dispatch, settle, comply, and intel. Enables AI agents to programmatically interact with substations, grid interfaces, and energy assets for real-time workload-grid coordination.

  • Zero-setup MCP gateway securely connecting AI to your tools with authentication and workflows

  • The Cortex MCP server provides read-only access to real-time engineering context from the Cortex developer portal, allowing AI coding assistants to answer natural language questions about your organization's catalog (microservices, libraries, domains, teams, infrastructure), scorecards (engineering standards and best practices), initiatives (goals and deadlines), and Engineering Intelligence metrics. It includes tools for querying documentation, tracking personal entities, and accessing AI-assisted insights across the entire Cortex ecosystem.

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A read-only FastMCP server that enables AI assistants to query and retrieve network infrastructure information from NetBox using natural language.
    MIT
  • A
    license
    A
    quality
    F
    maintenance
    Enables comprehensive interaction with NetBox infrastructure management through both read and write operations. Supports full CRUD operations for devices, IP addresses, sites, racks, and other NetBox objects through natural language commands.
    9
    17
    Apache 2.0
  • A
    license
    B
    quality
    D
    maintenance
    Enables read-only interaction with NetBox network documentation and infrastructure data through LLMs. Allows querying devices, sites, IP addresses, and viewing change history via natural language.
    3
    Apache 2.0
  • A
    license
    A
    quality
    B
    maintenance
    Read-only MCP server for NetBox that enables LLMs to query NetBox objects (devices, IPAM, etc.) and change logs through natural language, with field filtering for token optimization.
    4
    243
    Apache 2.0