Skip to main content
Glama

Binner MCP Server

A Model Context Protocol (MCP) server and Python API client providing a high-performance proxy to local Binner inventory instances (.NET 8 / Kestrel) and the Binner Swarm cloud component service (https://swarm.binner.io).


Overview

System Architecture

The codebase implements a decoupled dual-layered architecture with a common foundation core:

+-----------------------------------------------------------------------------------+
|                        Layer 2: MCP Protocol Binding Layer                        |
|                                                                                   |
|  - MCP Server Setup (binner_mcp.mcp.server.BinnerMCPServer)                       |
|  - Transports: stdio (JSON-RPC), http (Streamable HTTP), sse (Legacy SSE)         |
|  - 15 Registered Tools (System, Cloud, Inventory, Categories, Projects, BOM)      |
|  - 5 Dynamic Resources (Status, Categories, Low-Stock, Project BOM, Part Details) |
|  - Single-Thread FIFO Task Queue (ThreadPoolExecutor(max_workers=1))              |
|  - Pre-Flight Zero-Side-Effects Validation & extra="forbid" Safety Guard          |
+-----------------------------------------------------------------------------------+
                                          |
                                          v
+-----------------------------------------------------------------------------------+
|                       Layer 1: Python API Client Interfaces                       |
|                                                                                   |
|  Layer 1A: Local Binner API Client             Layer 1B: Swarmer Cloud Client     |
|  (binner_mcp.api.client.BinnerAPIProxy)        (binner_mcp.swarmer.SwarmClient)   |
|  ├── PartsComp (CRUD, stock deltas, labels)    ├── Pinouts, Footprints, Schematics|
|  ├── ProjectsComp (Maker projects, BOM items)  ├── Direct PDF Datasheet URLs      |
|  ├── PartTypesComp (Category tree management)  └── Quota Rate-Limit Tracking      |
|  ├── DataComp (CSV bulk import, ZIP export)                                       |
|  ├── SystemComp (Ping, version, server logs)                                      |
|  ├── PartCacheComp (Bidirectional ID <-> PN)                                      |
|  └── BaseBinnerClient (JWT + HttpOnly cookie)                                     |
+-----------------------------------------------------------------------------------+
                                          |
                                          v
+-----------------------------------------------------------------------------------+
|                       Common Core & Upstream Services                             |
|                                                                                   |
|  binner_mcp.common:                                                               |
|  - BaseHttpClient (requests.Session pooling, threading.RLock re-entrant safety)   |
|  - logging (sys.stderr routing, custom TRACE level 5, sensitive data redaction)   |
|  - Pydantic v2 Base Models & Unified Exception Hierarchy                          |
|                                                                                   |
|  Upstream Targets:                                                                |
|  - Local Binner Instance (.NET 8 / Kestrel, default: http://127.0.0.1:8090)       |
|  - Binner Swarm Cloud Service (https://swarm.binner.io)                           |
+-----------------------------------------------------------------------------------+

Layer Breakdown

  1. Layer 1A: Binner Python API Interface (binner_mcp.api):

    • Programmatic, MCP-agnostic REST client (BinnerAPIProxy) for local Binner instances.

    • Composed from modular domain components (PartsComp, ProjectsComp, PartTypesComp, DataComp, SystemComp).

    • In-Memory Identity Cache (PartCacheComp): Bidirectional mapping (_part_id_to_number, _part_number_to_id) that automatically resolves missing part numbers or IDs, eliminating upstream EF Core omission bugs.

    • Dual-Token Authentication (BaseBinnerClient): Manages JWT Bearer tokens and HttpOnly refresh cookies via POST /api/authentication/refresh-token, with 1-second timestamp granularity handling and automatic login fallback.

  2. Layer 1B: Swarmer Cloud API Interface (binner_mcp.swarmer):

    • Dedicated REST client (SwarmClient) for the Binner Swarm cloud service (https://swarm.binner.io).

    • Searches and retrieves pinout diagrams, package footprints, and direct PDF datasheets.

    • Automatic rate-limit tracking via response headers (x-rate-limit-limit, x-rate-limit-remaining, x-rate-limit-reset) and error classification (SwarmRateLimitError, SwarmTimeoutError).

  3. Common Core Foundation (binner_mcp.common):

    • BaseHttpClient: Connection-pooled HTTP session manager guarded by threading.RLock, ensuring thread safety for cookie jars and token rotation.

    • logging: Stdio transport-safe logging strictly targeting sys.stderr, supporting custom TRACE level (level 5) and recursive credential/token redaction (sanitize_for_trace).

  4. Layer 2: MCP Protocol Binding Layer (binner_mcp.mcp):

    • BinnerMCPServer exposes 15 tools and 5 dynamic resources using Python MCP SDK 2.

    • Multi-transport support: Standard I/O (stdio), modern Streamable HTTP (http), and legacy Server-Sent Events (sse).

    • Single-thread FIFO task queue (ThreadPoolExecutor(max_workers=1)) executing sync proxy operations sequentially to eliminate race conditions on session cookies or access tokens.

    • Strict argument validation (extra="forbid") and category path delimiter resolution (e.g. Passives::Resistors::SMD).


Key Capabilities

  • Dual Interface: Operate as a standalone Python library (BinnerAPIProxy, SwarmClient) or as an autonomous MCP server for AI agents.

  • Component Inventory Lifecycle: Batch creation/updates (save_parts), deletion (delete_parts), selective field projection (fields=['quantity', 'location', 'bin_number']), and low-stock alerting.

  • Strict Stock Adjustment Semantics: Explicit separation between absolute on-hand stock counts (save_parts, PUT /api/part) and additive deltas (adjust_stock_delta, POST /api/part/quantity, /increment, /decrement).

  • Hierarchical Category Management: Configurable delimiter-based category paths (default: ::, e.g. Passives::Resistors::SMD), automatic parent node provisioning, ambiguity detection with candidate suggestions, and lightweight tree inspection (depth, root_id, root_name).

  • Maker Projects & BOM Engineering: Project registration, Bill of Materials component allocation with silkscreen reference designators (e.g. R1, R2, C1), and optional simultaneous stock delta adjustments.

  • Production Batch Deduction with Shortage Circuit Breaker: Automated component deduction (consume_project_bom) for batch assemblies. If on-hand stock is insufficient for any BOM item, execution halts immediately with zero database mutations and returns a detailed shortage matrix.

  • Swarm Cloud Component Enrichment: Live querying of swarm.binner.io for pinouts, package footprints, and manufacturer datasheets via lookup_cloud_parts.

  • Pre-Flight Zero-Side-Effects Validation: In batch operations (save_parts, manage_bom_parts), full payload validation runs before any mutation executes; an error on any item aborts the entire batch.

  • Strict Parameter Enforcement: All MCP tools and models reject unknown arguments (extra="forbid"), preventing hallucinated arguments or subtle typos from corrupting inventory.

  • Deterministic Part Identity Resolution: Automatic reconciliation between numeric part IDs and alphanumeric part numbers, circumventing Binner backend query omission bugs.

  • Stdio Transport Safety: JSON-RPC transport stream protection via strict sys.stderr log routing.


Related MCP server: Relay

Installation

Prerequisites & Required Packages

  • Python: Version 3.10 or higher.

  • Binner Instance: A running local Binner server (default: http://127.0.0.1:8090).

  • Core Dependencies:

    • mcp (>=1.0.0): Official Model Context Protocol SDK providing tool, resource, and transport implementations.

    • requests (>=2.31.0): HTTP client managing session connection pooling, cookie jars, and token refreshes.

    • pydantic & pydantic-settings (>=2.0.0): Data validation, model definitions, and typed configuration loading.

Virtual Environment & Package Setup

Using an isolated virtual environment is recommended to manage dependencies cleanly:

# 1. Create a virtual environment
python3 -m venv .venv

# 2. Activate the virtual environment
# Linux / macOS:
source .venv/bin/activate
# Windows:
# .venv\Scripts\activate

# 3. Install package and dependencies in editable mode
pip install -e .

# Or install with optional development tools:
pip install -e ".[dev]"

Agent Skill Integration (docs/SKILL.md)

The repository includes a domain skill conforming to the open Agent Skills standard in docs/SKILL.md. While MCP provides the execution layer (tools and resources), the skill equips AI assistants with procedural knowledge: the 6-step lifecycle workflow, batch schemas, parameter constraints (extra="forbid"), and the automated BOM shortage circuit breaker. It leverages progressive disclosure (indexing metadata at startup and loading instructions on demand).

1. Native Skill Clients (Antigravity, Claude Code, Cursor, Copilot)

Enables automatic discovery and progressive disclosure without manual prompt injection.

Installation (Project or Global):

# Workspace / Project install (shared with team via version control):
mkdir -p .agents/skills/binner
cp docs/SKILL.md .agents/skills/binner/SKILL.md

# Or Global / User install (available across all local workspaces):
mkdir -p ~/.gemini/config/skills/binner
cp docs/SKILL.md ~/.gemini/config/skills/binner/SKILL.md

Symlinks are also supported: ln -s "$(pwd)/docs/SKILL.md" ~/.gemini/config/skills/binner/SKILL.md.

Discovery Paths:

  • Google Antigravity / Gemini CLI:

    • Workspace: .agents/skills/binner/SKILL.md (or .agent/skills/binner/SKILL.md)

    • Global: ~/.gemini/config/skills/binner/SKILL.md (or ~/.gemini/antigravity/skills/binner/SKILL.md)

  • Claude Code:

    • Workspace: .claude/skills/binner/SKILL.md

    • Global: ~/.claude/skills/binner/SKILL.md

  • Cursor (Agent Mode): .agents/skills/binner/SKILL.md or .cursor/skills/binner/SKILL.md

  • GitHub Copilot (Agent Mode): .agents/skills/binner/SKILL.md or .github/skills/binner/SKILL.md


2. Instruction & Rule-Based Clients (Claude Desktop, Cursor Rules, Cline / Roo Code)

For clients without native skill discovery directories, reference docs/SKILL.md directly in configuration or rule files.

Configuration Snippet:

# Include in your client instructions / rule file:
Read and adhere to the Binner domain workflows and constraints in docs/SKILL.md
when handling electronic parts, category hierarchies, Maker projects, or BOM assembly.

Configuration Paths:

  • Cursor: Add reference or include contents in .cursorrules or .cursor/rules/binner.mdc.

  • VS Code (Cline / Roo Code): Include path or content in .clinerules.

  • Claude Desktop: Attach docs/SKILL.md to Project Knowledge or add reference in Project Custom Instructions.

  • GitHub Copilot: Add reference to .github/copilot-instructions.md.


Configuration

Configuration parameters are evaluated in the following order of precedence (highest to lowest):

  1. Command-Line Arguments

  2. Environment Variables

  3. Configuration File (binnermcp_config.json)

  4. Built-in Defaults

Configuration Parameters

Parameter

CLI Flag

Environment Variable

Default

Description

base_url

—

BINNER_BASE_URL

http://localhost:8090

Base URL of local Binner instance

username

—

BINNER_USERNAME

admin

Username for Binner authentication

password

—

BINNER_PASSWORD

admin

Password for Binner authentication

log_level

--log-level

BINNER_LOG_LEVEL

INFO

Logging level (TRACE, DEBUG, INFO, WARNING, ERROR)

transport

--transport

BINNER_MCP_TRANSPORT

stdio

MCP transport (stdio, http, or sse)

host

--host

BINNER_MCP_HOST

127.0.0.1

Bind address for HTTP / SSE transport

port

--port

BINNER_MCP_PORT

8000

Port for HTTP / SSE transport

category_delimiter

--category-delimiter

BINNER_CATEGORY_DELIMITER

::

Delimiter for category hierarchy paths

log_file

--log-file

BINNER_LOG_FILE

None

Optional path to write log output in addition to stderr

retry_delay

--retry-delay

BINNER_RETRY_DELAY

3.0

Delay in seconds between transient retry attempts

retry_count

--retry-count

BINNER_RETRY_COUNT

1

Max retry attempts for transient network errors

config file

--config

BINNER_MCP_CONFIG

./binnermcp_config.json

Explicit path to binnermcp_config.json

Configuration File Resolution (binnermcp_config.json)

If no CLI flags or environment variables are provided, values are read from binnermcp_config.json. The server searches the following paths in order:

  1. Path passed via --config or BINNER_MCP_CONFIG

  2. Current working directory: ./binnermcp_config.json

  3. Project root directory

  4. User configuration directory: ~/.config/binnermcp/binnermcp_config.json

  5. System-wide configuration directory: /etc/binnermcp/binnermcp_config.json

Example binnermcp_config.json:

{
  "base_url": "http://localhost:8090",
  "username": "admin",
  "password": "your-password",
  "log_level": "INFO",
  "transport": "stdio",
  "host": "127.0.0.1",
  "port": 8000,
  "category_delimiter": "::",
  "retry_delay": 3.0,
  "retry_count": 1
}

MCP Server Usage

All logging routes strictly to sys.stderr to preserve JSON-RPC stream integrity.

# 1. Run with default stdio transport (local subprocess)
binner-mcp

# 2. Run over modern Streamable HTTP transport on port 8000
binner-mcp --transport http --host 127.0.0.1 --port 8000

# 3. Run over legacy Server-Sent Events (SSE) transport on port 8000
binner-mcp --transport sse --host 127.0.0.1 --port 8000

# 4. Run via Python module with explicit config and TRACE logging
python -m binner_mcp.main --config /path/to/binnermcp_config.json --log-level TRACE

Client Integration

1. Stdio Clients (Gemini / Antigravity, Claude Desktop, Cursor, VS Code)

Launches the server directly as a local subprocess over stdio.

Configuration (mcpServers block):

{
  "mcpServers": {
    "binner": {
      "command": "/path/to/venv/bin/binner-mcp",
      "env": {
        "BINNER_BASE_URL": "http://127.0.0.1:8090",
        "BINNER_USERNAME": "admin",
        "BINNER_PASSWORD": "your-password"
      }
    }
  }
}

If invoking via Python directly, set "command": "/path/to/venv/bin/python" with "args": ["-m", "binner_mcp.main"].

Configuration Paths:

  • Gemini / Antigravity: ~/.gemini/antigravity/mcp_config.json

  • Claude Desktop:

    • Linux: ~/.config/Claude/claude_desktop_config.json

    • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

    • Windows: %APPDATA%\Claude\claude_desktop_config.json

  • VS Code (Cline / Roo Code): cline_mcp_settings.json

  • Cursor: Under Settings > Features > MCP, click + Add New MCP Server (Name: binner, Type: command, Command: /path/to/venv/bin/binner-mcp).


2. Local HTTP & SSE Clients

Security Notice: Binner MCP is a local private sidecar. Never expose this server to external networks or the public internet.

For web-based or remote interfaces connecting via HTTP instead of a subprocess, run the server bound strictly to localhost (127.0.0.1):

# Modern Streamable HTTP (MCP SDK 2):
binner-mcp --transport http --host 127.0.0.1 --port 8000

# Legacy SSE:
binner-mcp --transport sse --host 127.0.0.1 --port 8000

MCP API Reference

Tools Directory (15 Registered Tools)

All tools enforce strict argument checking (extra="forbid") and execute through a single-thread FIFO proxy queue.

Tool Name

Domain

Primary Parameters

Summary

get_system_status

System

check_cloud: bool = False

Probe Binner connectivity, version, identity, and inventory statistics.

lookup_cloud_parts

Cloud

part_numbers: str[]

Query Binner Swarm cloud for pinouts, package footprints, and datasheets.

list_parts

Inventory

query, part_type, bin_number, location, package_type, manufacturer, low_stock_only, fields, page, limit, sort_by, direction

Paginated component search with metadata filtering and field projection.

get_parts

Inventory

part_numbers: str[], part_ids: int[], fields: str[]

Batch component inspection returning details, bin locations, and datasheets.

save_parts

Inventory

parts: PartSaveInput[]

Batch create or update components with strict pre-flight validation.

delete_parts

Inventory

part_numbers: str[], part_ids: int[]

Batch component deletion by part number or ID.

list_part_types

Categories

depth, root_id, root_name, include_descriptions, include_part_counts

Hierarchical category tree optimized for minimal LLM context usage.

save_part_types

Categories

part_types: PartTypeSaveInput[]

Batch create or update category hierarchy nodes.

delete_part_types

Categories

part_type_ids: int[], names: str[]

Batch category deletion by ID or name.

list_projects

Projects

query, page, limit, sort_by, direction

Paginated search of maker projects.

get_projects

Projects

project_ids: int[], names: str[], include_bom: bool = False

Batch maker project retrieval with optional normalized BOM breakdown.

save_projects

Projects

projects: ProjectSaveInput[]

Batch create or update maker projects.

delete_projects

Projects

project_ids: int[], names: str[]

Batch project deletion by ID or name.

manage_bom_parts

BOM

project_id: int, parts: BomPartInput[]

Batch allocate, modify, or remove BOM line items for a project.

consume_project_bom

BOM

project_id: int, name: str, build_quantity: int = 1

Deduct component stock for board unit assembly with shortage circuit breaker.


Dynamic Resources Directory (5 Registered Resources)

Resource URI

MIME Type

Description

binner://status

application/json

System health, version, auth identity, and aggregate inventory summary.

binner://categories

application/json

Hierarchical category tree with resolved category paths.

binner://low-stock

application/json

Filtered snapshot of components at or below low-stock thresholds.

binner://projects/{project_id}/bom

application/json

Complete Bill of Materials item breakdown for a specified project ID.

binner://parts/{identifier}

application/json

Complete specifications and category path for a part (by ID or part number).


Python API Quickstart

binner-mcp can also be used as a standard Python library:

from binner_mcp.api.client import BinnerAPIProxy
from binner_mcp.swarmer.client import SwarmClient

# 1. Connect to local Binner instance
client = BinnerAPIProxy(base_url="http://localhost:8090", username="admin", password="admin")
if client.ping():
    client.login()
    print(f"Logged in as: {client.get_identity().name}")

# 2. Query low stock parts
low_stock = client.get_low_stock(results=5)
for part in low_stock.items:
    print(f"Low stock: {part.part_number} (Qty: {part.quantity}, Min: {part.low_stock_threshold})")

# 3. Add additive stock delta
client.increment_quantity(part_number="NE555P", quantity=10)

# 4. Query cloud datasheets & pinouts from Binner Swarm
swarm = SwarmClient()
result = swarm.search_parts(part_number="2N3904")
if result.is_success and result.response:
    for part in result.response.parts:
        print(f"Swarm part: {part.name} - {len(part.part_number_manufacturers)} manufacturers found")

Development & Testing

Run tests and linting using the virtual environment:

# Run full test suite
virtenv/bin/python -m pytest tests/ -v

# Format with Black (100-char line length)
black --line-length 100 src/ tests/

License

MIT License - see LICENSE.txt.

Available Tools

15 tools
consume_project_bomC

Deduct inventory stock for assembling board units of a maker project's BOM.

Args: project_id: Numeric project ID to consume for. name: Project name to consume for. build_quantity: Number of complete board units to assemble (>= 1).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
project_idNo
build_quantityNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It discloses the core effect ('deduct inventory stock'), but for a destructive inventory mutation it omits critical traits: reversibility, behavior when stock is insufficient, atomicity/partial-failure handling, and required permissions.

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?

The purpose sentence is front-loaded and the args list is compact, with each line earning its place. Structure is clean, though the Args block is somewhat redundant with the schema keys.

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. However, for a destructive no-annotation mutation, the definition is thin on operational context (permissions, failure modes, whether both project_id and name are needed), leaving it only minimally 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 0%, so the description must compensate, and it does document all three parameters (project_id, name, build_quantity with '>= 1'). However, it leaves the interaction between the two mutually optional identifiers (project_id vs name) unexplained, which is a meaningful gap.

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 states a specific verb and resource: 'Deduct inventory stock for assembling board units of a maker project's BOM.' An agent can tell this mutates inventory for a project's bill of materials. It does not explicitly contrast itself with siblings like manage_bom_parts, so it earns a 4 rather than 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 Guidelines2/5

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

There is no guidance on when to use this tool versus alternatives such as manage_bom_parts, nor any stated prerequisites (e.g., that a BOM must already exist). The reader must infer usage entirely from the one-line purpose.

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

delete_partsC

Batch delete parts by part number or ID.

Args: part_numbers: Part numbers to delete. part_ids: Numeric part IDs to delete.

ParametersJSON Schema
NameRequiredDescriptionDefault
part_idsNo
part_numbersNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior2/5

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

No annotations are present, so the description carries the full disclosure burden. It says 'delete' but never states whether deletion is permanent, what happens to BOM references or dependent records, whether permissions are required, or what occurs if both identifier lists are omitted.

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 the core action in one sentence, and the argument listing is terse. The Args block largely duplicates schema titles, which is minor waste but not bloat.

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

Completeness2/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, but this is a destructive, zero-required-parameter tool with no annotations and no coverage of cascade effects, mutual exclusivity of the two identifier inputs, or empty-input behavior. Significant behavioral gaps remain.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate, but it only restates the parameter names ('Part numbers to delete', 'Numeric part IDs to delete'). It does not explain that both are optional, whether they are mutually exclusive, how they combine, or what happens with neither supplied.

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 ('Batch delete parts') and notes the two identification methods, so the operation is unambiguous. It does not differentiate from adjacent siblings such as delete_part_types or delete_projects, keeping it 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 Guidelines2/5

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

The description gives no when-to-use context, no alternatives (e.g., save_parts or manage_bom_parts), and no prerequisites. An agent must infer usage entirely from the name.

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

delete_part_typesC

Batch delete part types by ID or name.

Args: part_type_ids: Numeric part type IDs to delete. names: Part type names to delete.

ParametersJSON Schema
NameRequiredDescriptionDefault
namesNo
part_type_idsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden, and it discloses almost nothing: not that deletion is irreversible, not whether part types referenced by existing parts/BOMs can be deleted, not required permissions, and not what happens if both keys or neither key are supplied (both parameters are nullable with no required 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?

One front-loaded sentence stating verb, resource and scope, followed by a compact argument list. Nothing is padded, though the Args block largely restates schema field names rather than adding information.

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

Completeness2/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, but for a destructive batch operation with zero annotation coverage the description is incomplete: no irreversibility warning, no dependency/constraint information, and no error behavior for invalid or partially matching IDs.

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 0%, so the description must compensate, and it does add brief meaning for both parameters ('Numeric part type IDs' vs 'Part type names'). However, it omits critical semantics: whether the two are mutually exclusive, whether one must be supplied, and how conflicts between a matching ID and name are resolved.

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 gives a specific verb and resource ('Batch delete part types') plus the two lookup keys ('by ID or name'). It is clearly distinguishable from sibling delete_parts and delete_projects by resource, though it never explicitly contrasts itself with them.

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?

There is no when-to-use guidance, no statement of prerequisites, and no mention of alternatives such as delete_parts for removing part instances rather than type definitions. The agent must infer everything about selection from the name alone.

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

delete_projectsC

Batch delete maker projects by ID or name.

Args: project_ids: Numeric project IDs to delete. names: Project names to delete.

ParametersJSON Schema
NameRequiredDescriptionDefault
namesNo
project_idsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden for a destructive operation. It discloses only that deletion is batched; it says nothing about irreversibility, permission requirements, partial-failure behavior, or what happens when a name does not resolve to a project. For a destructive tool with zero annotation coverage this is a significant gap.

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?

Three short lines, front-loaded with the action and resource, with no filler. The 'Args:' block is boilerplate but compact and readable, so nothing wastes space.

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

Completeness2/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. But for a destructive batch tool with no annotations, the description omits the safety-critical context an agent needs: irreversibility, whether project_ids and names are alternatives, and behavior on missing or duplicate identifiers.

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 0%, so the description must supply all parameter meaning, and it does document both params (numeric project_ids, project names). However it does not explain that both are optional with null defaults, whether at least one is required, or whether the two selectors can be combined, leaving key semantics unresolved.

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: 'Batch delete maker projects'. The 'batch' qualifier and the resource make it easy to distinguish from siblings like delete_parts or delete_part_types without opening the schema. It stops short of naming a sibling, so it is clear but not perfectly differentiated.

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?

There is no when-to-use or when-not-to-use guidance, no prerequisites, and no mention of the sibling alternatives (list_projects, get_projects, save_projects). The agent must infer that this is the deletion path for projects purely from the name.

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

get_partsC

Get component details, bin locations, category paths, and datasheets by part number or ID.

Args: part_numbers: Part numbers to fetch. part_ids: Numeric part IDs to fetch. fields: Optional list of specific fields to return (e.g. ['quantity', 'bin_number', 'location']).

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsNo
part_idsNo
part_numbersNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden, and it discloses almost nothing: it does not say whether at least one of part_numbers/part_ids is required, what happens if both are supplied or neither is, whether batching is capped, or how missing parts are reported. Naming the data categories returned (bins, category paths, datasheets) is the only real added context.

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 single-sentence purpose followed by a tight Args block. The parameter restatements are mildly redundant with the schema titles, but they add the fields example and are brief enough not to be wasteful.

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-value explanation is correctly omitted, and the description does name what is returned. Still, for a reader-only tool with zero annotations and zero schema descriptions, the omission of the part_numbers/part_ids requirement contract leaves a real gap an agent could trip on.

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 0% (only bare titles), so the description must compensate. It does restate each parameter and, notably, gives a concrete example for 'fields' (['quantity', 'bin_number', 'location']) that the schema lacks. However it never states the mutual-exclusion/at-least-one relationship between part_numbers and part_ids, which is the key ambiguity for a 0-required-parameter tool.

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 states a specific verb ('Get') and resource ('component details, bin locations, category paths, and datasheets') and narrows the lookup key to part number or ID. It is clear on its own, but it never distinguishes itself from the close siblings list_parts or lookup_cloud_parts, so an agent cannot tell from the text alone which of the three to pick.

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?

There is no when-to-use or when-not-to-use guidance and no named alternative, despite three sibling tools (list_parts, lookup_cloud_parts) that plausibly overlap with this lookup. Usage is only implied by the phrase 'by part number or ID'.

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

get_projectsB

Batch inspect maker projects by IDs or names, with optional BOM inclusion.

Args: project_ids: Numeric project IDs to inspect. names: Project names to inspect. include_bom: Include Bill of Materials for each project.

ParametersJSON Schema
NameRequiredDescriptionDefault
namesNo
include_bomNo
project_idsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It conveys a read-style batch fetch, but says nothing about what happens with unknown or missing IDs, whether partial failures abort the batch, whether BOM inclusion is expensive, or any permission requirements.

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?

Short and front-loaded: the summary sentence states the operation before the arg list. The Args block largely repeats the schema property names, but it is compact and wastes little space.

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-value explanation is not required. Still, for a batch lookup tool with zero required parameters and no annotations, the description omits key calling details such as the IDs-or-names requirement and behavior for unresolved identifiers.

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 0%, so the description must compensate; it does gloss all three parameters (project_ids, names, include_bom) with their intent. That said, the glosses only restate the parameter titles, giving no format, cardinality, or the important constraint that at least one of project_ids/names is presumably required.

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 ('Batch inspect maker projects') plus the two lookup modes (IDs or names) and an optional enrichment (BOM). It is distinguishable from list_projects by its explicit 'by IDs or names' batch-lookup framing, though it never names that sibling.

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?

'Batch inspect ... by IDs or names' implies the usage context: direct retrieval when identifiers are already known, as opposed to enumerating. However, there is no explicit when/when-not guidance and no mention of list_projects as the alternative for browsing.

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

get_system_statusA

Get Binner instance health, version, user identity, and inventory summary.

Args: check_cloud: Probe Binner Swarm cloud reachability.

ParametersJSON Schema
NameRequiredDescriptionDefault
check_cloudNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. 'Get' implies a non-mutating read and the check_cloud flag is described as a reachability probe, which hints at an optional external call, but there is no disclosure of permissions, latency, or whether the cloud probe can fail independently.

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 purpose sentence followed by a one-line parameter note; nothing is padded. The 'Args:' formatting is slightly boilerplate for a single optional flag but is not 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?

An output schema exists, so return values need not be described, yet the description helpfully lists the retrieved categories anyway. For a zero-required-param read tool this is nearly sufficient; only auth/permission expectations are absent.

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 0%, but the single parameter is explained in the description ('Probe Binner Swarm cloud reachability'), which adds real meaning beyond the schema's bare boolean. The default value of false is not mentioned, keeping it short of a 5.

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 and resource ('Get Binner instance health, version, user identity, and inventory summary') and enumerates exactly what the caller receives. This clearly separates it from every sibling, which deals with parts, part types, BOMs, and projects.

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 tool is obviously a diagnostics/health probe. There is no explicit when-to-use, no mention of prerequisites, and no routing to a sibling for related data (e.g. inventory summary vs. list_parts).

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

list_partsB

Search and filter parts. Returns (id, part_number) unless extra fields are requested.

Args: query: Search keyword across part numbers and descriptions. part_type: Filter by category name or path. bin_number: Filter by storage bin. location: Filter by room or cabinet. package_type: Filter by footprint/package (e.g. '0805', 'SOIC-8'). manufacturer: Filter by manufacturer name. low_stock_only: Return only parts at or below threshold. fields: Extra fields to return (e.g. ['quantity', 'location', 'bin_number']). page: Page number (1-based). limit: Max results per page (1-500). sort_by: Column to sort by (default 'DateCreatedUtc'). direction: 'Ascending' or 'Descending'.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
limitNo
queryNo
fieldsNo
sort_byNoDateCreatedUtc
locationNo
directionNoDescending
part_typeNo
bin_numberNo
manufacturerNo
package_typeNo
low_stock_onlyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It discloses the default return fields and that extra fields require the 'fields' param, but does not cover pagination behavior (despite page/limit params), permissions, rate limits, or mutation risk. An output schema exists, so return value detail is less critical, but behavioral context remains thin.

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 purpose statement followed by a compact parameter list. Each line earns its place by clarifying an otherwise undocumented parameter. Slightly list-heavy but appropriately sized for 12 params.

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?

Given 12 parameters with zero schema descriptions and no annotations, the description covers parameter semantics well but omits usage guidance, pagination behavior, and any behavioral risk context. It is minimally complete for invoking the tool but leaves gaps for an agent deciding between list_parts and get_parts.

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 0%, so the description must compensate. It does so thoroughly, defining all 12 parameters with meaning, examples (e.g., '0805', 'SOIC-8'), ranges (limit 1-500), and defaults (sort_by 'DateCreatedUtc', direction 'Ascending'/'Descending'). This is a strong param clarification effort, though 'part_type' enum values aren't listed.

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/search) and resource (parts), and the return behavior '(id, part_number) unless extra fields are requested' distinguishes it from get_parts. Sibling differentiation is implicit via the broad filter set, but not explicitly contrasted with get_parts.

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 guidance on when to use list_parts vs get_parts or other siblings. The description implies search/filter usage but provides no when-to-use or when-not-to-use conditions.

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

list_part_typesA

List part types structured as a lightweight hierarchical tree focusing on IDs and names.

Args: depth: Optional maximum depth of tree recursion (e.g. 1 for top-level root categories only). root_id: Optional root category ID to scope the tree to a single subtree. root_name: Optional root category name to scope the tree to a single subtree. include_descriptions: If True, includes description per node (default False). include_part_counts: If True, includes parts count per part type (default False).

ParametersJSON Schema
NameRequiredDescriptionDefault
depthNo
root_idNo
root_nameNo
include_part_countsNo
include_descriptionsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description carries the burden, and it does disclose the return shape (lightweight tree of IDs/names, optional descriptions and part counts). It says nothing about pagination, permissions, or whether unmentioned part types are omitted, so the behavioral picture is only partially filled.

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?

The purpose sentence is front-loaded and the parameter list is tight with no filler. The Args block is somewhat formulaic but every entry adds 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?

An output schema exists, so explaining return values is unnecessary, and all five parameters are covered. What's missing is sibling routing and any note on permissions or result size for a potentially deep tree.

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 0%, so the description must compensate, and it does: it documents all five parameters with intent and defaults (depth as max recursion, root_id/root_name as subtree scoping, both include_* flags defaulting False). Only the interaction between depth and root scoping is left unstated.

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?

Specific verb+resource ("List part types") plus a concrete shape ("lightweight hierarchical tree focusing on IDs and names"). It reads as distinct from get_parts/list_parts, but it never explicitly differentiates itself from those siblings.

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 through the Args notes — e.g. "1 for top-level root categories only" and root scoping — which hints at how to narrow the tree. There is no explicit when-to-use-this-vs-list_parts guidance and no exclusions stated.

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

list_projectsA

Search and list maker projects with pagination, keyword search, and metadata.

Args: page: Page number (1-based). limit: Max projects to return (1-500). sort_by: Column to sort by (default 'DateCreatedUtc'). direction: 'Ascending' or 'Descending'. query: Optional search keyword to filter projects by name or description.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
limitNo
queryNo
sort_byNoDateCreatedUtc
directionNoDescending

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. It does disclose useful behavior beyond the schema: pagination, and that the keyword search matches project name or description. However it says nothing about permissions/auth requirements, result ordering guarantees, or the fact that this is a non-mutating read — gaps that matter when no readOnlyHint is declared.

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 a single summary sentence, followed by a compact Args block. The Args list partially restates schema titles, but given the 0% schema coverage that duplication is earning its place rather than 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 values need not be explained, and the description covers the paging/sorting/filtering surface an agent needs to call it correctly. It falls short only on auth/permission context and the enumeration of sortable columns.

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 0%, so the description must compensate, and it largely does: page is 1-based, limit is bounded 1-500, sort_by defaults to DateCreatedUtc, direction takes 'Ascending'/'Descending', and query filters by name or description. Only minor gaps remain (e.g., allowed sort_by columns beyond the default).

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 and list maker projects') plus the capabilities involved (pagination, keyword search, metadata). It is clearly separable from save_projects/delete_projects by the list verb, but it never distinguishes itself from get_projects (single-project retrieval), which a sibling-aware agent would want to know.

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 when to use it (browsing/searching projects) through the query and pagination parameters, but gives no explicit when-to-use guidance and no exclusions or pointers to alternatives such as get_projects for a single project. Usage is inferable rather than stated.

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

lookup_cloud_partsB

Lookup manufacturer pinouts, package footprints, and datasheets from Binner Swarm cloud.

Args: part_numbers: Part numbers / MPNs to look up.

ParametersJSON Schema
NameRequiredDescriptionDefault
part_numbersYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. The word 'lookup' implies a non-destructive read, which is the main behavioral inference available, but there is no mention of network dependency, latency, caching, or what happens for unknown part numbers.

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?

One front-loaded sentence names the purpose and source; the Args block is brief. Slightly redundant restatement of the single parameter, but nothing 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?

For a one-parameter read tool with an output schema already documenting return values, this is close to sufficient. The main missing piece is guidance on local-vs-cloud selection against the many sibling part tools.

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 0%, so the description's 'part_numbers: Part numbers / MPNs to look up' does real work, clarifying that MPNs are acceptable and that multiple identifiers can be supplied. It stops short of specifying formats, case sensitivity, or array size limits.

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 (lookup) plus concrete resources (manufacturer pinouts, package footprints, datasheets) and a source (Binner Swarm cloud). It does not explicitly differentiate itself from siblings like get_parts or list_parts, which presumably serve the local inventory, so the agent must infer that 'cloud' is the distinguishing scope.

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 guidance on when to use this over get_parts/list_parts, no prerequisites, no note about behavior when a part is not found in the cloud. The agent must guess the routing between local and cloud lookups.

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

manage_bom_partsC

Batch allocate, update, or remove BOM line items for a project.

Args: project_id: Target project ID. parts: BOM items with 'part_number'/'part_id', 'quantity', 'reference_designator', optional 'remove'.

ParametersJSON Schema
NameRequiredDescriptionDefault
partsYes
project_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description carries the full behavioral burden. It signals that operations are batched and that 'remove' deletes a line item, but says nothing about permissions required, whether removals are reversible, or how the optional stock adjustment interacts with allocation—significant gaps for a destructive mutation tool.

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 the purpose, followed by a compact Args block. It is appropriately sized, though the parameter list paraphrases schema content rather than adding new detail.

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, and the batch semantics are conveyed. Still, for an unannotated multi-operation mutation tool the description leaves gaps around permissions, reversibility, and the stock-adjustment behavior that an agent would want before calling.

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?

Top-level schema coverage is 0%, but the nested BomPartInput fields are individually documented in the schema. The description summarizes most item fields ('part_number'/'part_id', 'quantity', 'reference_designator', optional 'remove') yet omits 'notes' and 'adjust_stock_delta', so it adds only marginal value over the nested schema descriptions.

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 specific verbs (allocate, update, remove) with a clear resource (BOM line items) and scope (for a project), so an agent knows exactly what the tool mutates. It does not, however, explicitly distinguish itself from the nearby consume_project_bom sibling.

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?

The description implies batch manipulation of BOM items but gives no when-to-use guidance, no prerequisites, and no mention of alternatives such as consume_project_bom. The agent must infer which sibling to pick from the name alone.

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

save_partsB

Batch create or update parts. Each item requires 'part_number'.

Args: parts: Part records with fields (e.g. 'part_number', 'quantity', 'cost', 'bin_number', 'part_type'). 'part_type' accepts a numeric ID (e.g. 10 or '10') or a category path/name string.

ParametersJSON Schema
NameRequiredDescriptionDefault
partsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full disclosure burden for a mutation tool. It never states whether omitted fields are preserved or nulled on update, whether the batch is transactional or partially applied on failure, or what permissions are required. 'Batch' is the only behavioral signal given.

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 the core action in the first sentence, and the Args block is short. The field examples and 'part_type' note are somewhat redundant with the nested schema, keeping it just short of maximally efficient.

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 no explanation. However, for a batch upsert with no annotations, the description should say how create vs. update is determined and how the batch behaves on partial failure; those gaps leave the agent guessing about mutation semantics.

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?

The top-level schema exposes only 'parts' with no description, but the nested PartSaveInput definition documents every field in detail, so the agent is not actually left in the dark. The description's Args block largely repeats what the nested schema already says ('part_number' required, 'part_type' accepting an ID or category path) rather than adding new meaning.

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 with scope: 'Batch create or update parts'. Cleanly distinguishes from save_part_types (types, not part records) and get_parts/list_parts. It stops short of naming a sibling or the create-vs-update selection condition, so it is clear but not differentiating.

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 only implied by the phrase 'Batch create or update', leaving the agent to infer that passing 'part_id' selects an update while omitting it creates. No guidance about when to prefer this over save_part_types, delete_parts, or manage_bom_parts, and no prerequisites or batch-size limits.

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

save_part_typesC

Batch create or update part types.

Args: part_types: Part type records with 'name', optional 'description', optional 'parent_part_type_id', optional 'part_type_id'.

ParametersJSON Schema
NameRequiredDescriptionDefault
part_typesYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It reveals only that the operation is a batch upsert; it says nothing about what happens to existing fields not supplied, whether batch operations are atomic or partially applied on failure, or what permissions are needed. For a mutation tool with zero annotation coverage this is a substantial gap.

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?

The purpose sentence is front-loaded and the Args block is terse with no filler. The Args list is somewhat redundant with the nested schema descriptions, which costs a little value but the overall size is appropriate.

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

Completeness2/5

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

For a batch mutation tool with no annotations and no output-schema burden, the description omits upsert conflict semantics, batch failure behavior, and create-vs-update disambiguation. These are exactly the behaviors an agent needs before calling a batch write.

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?

Reported top-level schema description coverage is 0%, but the nested PartTypeSaveInput properties do carry their own descriptions (name, description, part_type_id, parent_part_type_id). The description's Args block largely restates those fields with 'optional' markers and adds little beyond them, so it only partially compensates for the top-level coverage gap.

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 opens with a specific verb pair plus resource: 'Batch create or update part types.' An agent can distinguish this upsert tool from siblings like list_part_types and delete_part_types. It stops short of naming a specific alternative (e.g. save_parts), so it's clear but not sibling-differentiating.

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?

There is no guidance on when to use this versus save_parts or list_part_types, no prerequisites, and no explanation of when an update path (part_type_id) should be preferred over a create path. The 'create or update' phrasing implies upsert but leaves the selection criteria entirely to inference.

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

save_projectsB

Batch create or update maker projects. Each item requires 'name' (for create) or 'project_id' (for update).

Args: projects: Project records with 'name', optional 'description', optional 'project_id', optional 'archived'.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full disclosure burden. It does disclose that operations are batched and that each item is either a create or an update, but it says nothing about partial-failure behavior, whether updates are merge/overwrite, permission requirements, or rate limits for a mutation tool.

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 plus a compact Args block, front-loaded with the core purpose. The first line and the Args section restate the name/project_id rule, a small redundancy, but nothing is bloated.

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-value documentation is unnecessary, and the required-parameter structure is clear. Still, for an unannotated batch mutation the definition omits failure semantics and permission expectations that an agent needs before committing a batch write.

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?

Top-level schema description coverage is 0%, though the nested ProjectSaveInput properties do carry their own descriptions. The description compensates by naming the accepted keys ('name', 'description', 'project_id', 'archived') and the conditional requirement rule, but adds no format, range, or null-handling detail beyond what the nested schema already states.

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 ('Batch create or update maker projects') and captures the upsert nature, which distinguishes it from list_projects/get_projects/delete_projects. It does not explicitly name those siblings or clarify ordering/relationship with delete_projects, so it falls short of the 5 bar.

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 through the create/update mode rule ('name' for create, 'project_id' for update), which is actionable context. However, it never says when to reach for this tool versus list_projects or delete_projects, nor does it warn about preconditions (e.g. fetching existing project_ids via get_projects first), so guidance is only implied.

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. 15 tool updatesv0.1.0
    • First observedconsume_project_bom
    • First observeddelete_part_types
    • First observeddelete_parts
    • First observeddelete_projects
    • First observedget_parts
    • First observedget_projects
    • First observedget_system_status
    • First observedlist_part_types
    • First observedlist_parts
    • First observedlist_projects
    • First observedlookup_cloud_parts
    • First observedmanage_bom_parts
    • First observedsave_part_types
    • First observedsave_parts
    • First observedsave_projects

TDQS

B3.4/5.0

Scored across 15 tools

Disambiguation4/5

Most tools have clearly distinct purposes: parts, projects, part types, BOM operations, cloud lookup, and system status are largely separate concerns. The main potential confusion is between list_parts (search by keyword/filter) and get_parts (fetch by ID/number), and between manage_bom_parts and consume_project_bom, but the descriptions draw workable boundaries.

Naming Consistency5/5

All names follow a consistent verb_noun snake_case pattern (list_parts, get_parts, save_parts, delete_parts, list_projects, save_part_types, etc.). The upsert verb 'save' is applied uniformly, and resource suffixes are consistent across the parts/projects/part_types families.

Tool Count5/5

15 tools is well-scoped for a parts/inventory management server spanning parts, projects, part types, BOM, and cloud lookup. Each family (parts, projects, part types) has a coherent CRUD-style cluster with no redundant or filler tools.

Completeness4/5

Parts and projects have full list/get/save/delete coverage, and BOM plus cloud lookup round out the lifecycle. Minor gaps: part types lack a dedicated get (though list_part_types can scope a subtree), and there is no direct tool for managing bins/locations despite parts referencing them.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers